使用串联和 LIKE 的查询性能

2024-07-01

有人可以解释这 3 个查询之间的性能差异吗?

concat()功能:

explain analyze 
select * from person 
where (concat(last_name, ' ', first_name, ' ', middle_name) like '%Ива%');

Seq Scan on person  (cost=0.00..4.86 rows=1 width=15293) (actual time=0.032..0.140 rows=6 loops=1)
  Filter: (pg_catalog.concat(last_name, ' ', first_name, ' ', middle_name) ~~ '%Ива%'::text)
Total runtime: 0.178 ms

SQL 标准连接||:

explain analyze 
select * from person 
where ((last_name || ' ' || first_name || ' ' || middle_name) like '%Ива%');

Seq Scan on person  (cost=0.00..5.28 rows=1 width=15293) (actual time=0.023..0.080 rows=6 loops=1)
  Filter: ((((((last_name)::text || ' '::text) || (first_name)::text) || ' '::text) || (middle_name)::text) ~~ '%Ива%'::text)
Total runtime: 0.121 ms

分别搜索字段:

explain analyze 
select * from person 
where (last_name like '%Ива%') or (first_name like '%Ива%') or (middle_name like '%Ива%');

Seq Scan on person  (cost=0.00..5.00 rows=1 width=15293) (actual time=0.018..0.060 rows=6 loops=1)
  Filter: (((last_name)::text ~~ '%Ива%'::text) OR ((first_name)::text ~~ '%Ива%'::text) OR ((middle_name)::text ~~ '%Ива%'::text))
Total runtime: 0.097 ms

Why is concat()最慢的一个,为什么有几个like条件更快?


虽然不是具体答案,但以下内容可能会帮助您得出一些结论:

  1. Calling concat连接三个字符串,或使用||运算符,导致 postgres 必须分配一个新的缓冲区来保存连接的字符串,然后将字符复制到其中。必须对每一行执行此操作。然后缓冲区必须在最后被释放。

  2. 如果您将三个条件进行“或”运算,postgres 可能只需评估其中的一个或两个条件即可决定是否必须包含该行。

  3. 表达式求值可以使用||与函数调用相比,运算符可能更高效,或者更容易优化concat。如果发现内部操作员有一些特殊情况处理,我不会感到惊讶。

  4. 正如评论中提到的,您的样本太小,无论如何都无法得出正确的结论。在几分之一毫秒的水平上,其他噪声因素可能会扭曲结果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用串联和 LIKE 的查询性能 的相关文章

  • 选择两列之和的最大值

    我有一个表格比较 如果我跑 SELECT comparisonID stu1Vers stu2Vers stu1 stu2 from comparisons WHERE stu1 stu2 and assignmentid 9 我得到类似的
  • SQL Server 链接服务器性能

    我正在使用 SQL Server 2008 Enterprise 我正在使用链接服务器技术从另一台服务器链接另一个 SQL Server 2008 Enterprise 实例 我编写 TSQL 来操作两个服务器实例中的对象 例如表 我的问题
  • 使用串联和 LIKE 的查询性能

    有人可以解释这 3 个查询之间的性能差异吗 concat 功能 explain analyze select from person where concat last name first name middle name like Se
  • mysql:显示表-定义列名

    我正在用 LIKE 执行 mySQL SHOW TABLES 例如 show TABLES like address 返回以 address 开头的所有表 效果很好 返回的表名的列名是 Tables in username users ad
  • “无法在查询内执行DML操作”的解决方案?

    我正在使用数据分析工具 我的要求是接受用户的值 将其作为参数传递并将其存储在表中 非常简单 所以我坐下来写这篇文章 create or replace procedure complex datainput in VARCHAR2 is b
  • 如何将 Postgres JSONB 数据类型与 JPA 结合使用?

    我没有找到使用 JPA EclipseLink 从 PostgreSQL 映射 JSON 和 JSONB 数据类型的方法 有人在 JPA 中使用这种数据类型并且可以给我一些工作示例吗 所有答案都帮助我找到了适合 JPA 的最终解决方案 而不
  • Zend DB Select 具有多个表联接

    尝试使用复制以下查询Zend Db Select 有什么指点吗 SELECT compounds id as compounds id reactions id as reactions id reaction compound numbe
  • 限制最大值和分组依据返回太多行

    我正在使用 SQL Server 数据库 给出以下查询 我试图获得每个班级的最高分 这Scores表有 50 行用于两个类 所以我总共需要 2 行 但是 因为我有Scores Id 它返回每一行Scores since Scores Id是
  • 如何避免sql死锁?

    我正在使用 MS SQL 2008 并在 Web 项目中使用 C 进行编码 目前 我遇到了 sql 死锁问题 我有两笔交易 其中两笔是长交易 当两个事务同时运行时 就会发生死锁 短事务会被自动选择杀死 我当前的解决方案 我正在捕获死锁异常并
  • PostGIS 插入 WKT 后会自动转换吗?

    我对 PostGIS 还很陌生 所以请耐心等待 假设我有一个表定义如下 CREATE TABLE gtest name varchar geom geometry 首先 插入 我正在做类似的事情 INSERT INTO gtest VALU
  • 无法在 Postgres (9.3) 索引中使用 concat 函数

    我正在几个文本列上创建索引 在 Postgres 9 3 中 我想使用concat e g CREATE INDEX ON my table USING gin to tsvector english concat title descri
  • 如何在 MYSQL 中通过另一列选择具有 MAX(列值)、PARTITION 的行?

    我有一张球员表现表 CREATE TABLE TopTen id INT UNSIGNED PRIMARY KEY AUTO INCREMENT home INT UNSIGNED NOT NULL datetime DATETIME NO
  • 将数组插入postgresql

    我想将 id 数组插入到文件中 但在创建我使用的表时int 并且它具有另一个表的引用 现在如何将数组值存储到特定字段 我知道列必须是相同的类型 而且我还看到有些人已经尝试解决数组问题上的外键 我也根据这个文档尝试过 ELEMENT 但没有成
  • 所有排序规则下包含相同长度整数的字符串的数字排序顺序

    是否可以安全地假设 SQL Server 中的所有排序规则都会对包含相同长度整数的字符串给出 预期 即数字 排序顺序 例如 假设 text仅包含非负整数 0 9 以下代码片段是否可以确保该值不会溢出int范围 或者可能有一些排序规则 tex
  • 查询每组前 N 个代码适用于 MySQL,但适用于 MariaDB,结果不同

    我有一个 SQL 查询 它提取每组的最新 3 条记录 MySQL 的查询结果与 MariaDB 不同 该查询在下面的sqlfiddle中实现 http sqlfiddle com 9 c09fe 2 http sqlfiddle com 9
  • MySQL插入固定值和多select结果的数据

    假设我有一个如下所示的表结构 通知表 id receiver id type content time 接收者 ID 来自用户表 用户表 id username 内容和时间来自广播表 广播表 id content time 因此 当我需要插
  • 向 SQL Server 用户授予执行权限以仅运行特定作业

    我请求创建可由特定 SQL 用户运行的 SQL Server 代理作业 如何在不授予用户执行权限的情况下完成此操作sp start job存储过程意味着他也可以运行所有其他禁止的作业 如果不授予用户对 sp start job 存储过程的执
  • 在 Oracle 中将 varchar 拆分为单独的列

    我有点困惑 我被要求接受以数据库中的特定字符串开头的注释 并将结果分成单独的列 例如 如果返回值是这样的 COLUMN ONE D7ERROR username 回报必须是 COL ONE COL TWO D7ERROR username
  • 滚动每日不同计数

    我们有一个包含以下列的表 SESSION ID USER ID CONNECT TS 1 99 2013 01 01 2 23 33 2 101 2013 01 01 2 23 55 3 104 2013 01 01 2 24 41 4 1
  • 如何获取 Postgresql 过程警告消息?

    运行存储过程时 该过程可能会引发警告消息 有没有办法使用 Postgresql 驱动程序获取这些消息 https github com lib pq https github com lib pq 在戈兰 For lib pq司机的回答是

随机推荐