这两个sql查询语句哪个更快?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这两个sql查询语句哪个更快?相关的知识,希望对你有一定的参考价值。

两个表
TableA:
id name
1 a
2 b
3 c
......
TableB:
id value
1 A
2 B
3 C
......
现在要查出所有TableA的name列like '%b%'所对应的TableB的value
有这两个sql语句,哪个效率更高呢?
A:select b.value from TableA a, TableB where a.id = b.id and a.name like '%b%';
B:select value from TableB where id in (select id from TableA where name like '%b%');
说明理由,还有就是如何看一个语句执行花费的时间呢?
再补充一个:
C:select b.value from (select * from TableA where name like '%b%') a, TableB b where a.id = b.id;
三楼提到join,A和C都是全联结,到了数据库他会自动转换的吧。对于C,我觉得他先对TableA查询得到的数量大大减少,再联合TableB,速度是不是会比A快呢?

TableA, TableB的记录都会在1万条以上。

参考技术A A快。
我觉得不该从联合查询的角度考虑。B,C都是进行了两次搜表查询,select id from TableA where name like '%b%',再从所得的结果中select value。
等于对数据搜了两遍。也就是对第一遍选中的数据,再一次读取并与第二次的条件比较,而A方法只对同一数据进行了一次比较。如果数据量大的话效率会比较低。
参考技术B 添加2万条记录

实际操作一下
参考技术C A快.
理由.两个都是检索了两个表.
A 先查出a.id = b.id的记录 然后再查 a.name like '%b%'
B 先查出a.name like '%b%' 的所有记录 然后在查处 TableB.id in 这个记录集的记录
诈看上去意思都一样..但是B用了 IN 这个查询语句中比较拉速度的关键词!
所以速度降低!

至于查看时间.你可以找些软件.或者自己编一个. 但大数据量的时候就会体现出差距

想再快!用连接查询(JOIN)本回答被提问者采纳
参考技术D A效率高,A是单次循环查询,B属于多次双循环,所以A效率高,具体执行时间还真不知道怎么看,反正都是一瞬间

哪个sql查询更快?

【中文标题】哪个sql查询更快?【英文标题】:Which sql query is faster? 【发布时间】:2014-12-25 11:29:56 【问题描述】:

我正在使用 postgresql 数据库并希望改进查询(第一个)。我将其重写为第二个。但是我读了一篇文章,上面说“NOT IN”是非常缓慢的构造。我希望您说出两者中哪一个更快和/或提出更好的解决方案。

第一次查询

UPDATE reseller_product d SET status=3 FROM (
    SELECT reseller_product.sku FROM reseller_product
    LEFT OUTER JOIN main_table ON main_table.sku=reseller_product.sku
    WHERE main_table.sku IS NULL AND reseller_product.reseller_id='||resID||'
)as r
WHERE d.sku=r.sku and d.distributor_id='||distrID||' and d.reseller_id='||resID||'

第二次查询

UPDATE reseller_product SET status=3
WHERE distributor_id='||distrID||' AND reseller_id='||resID||' 
AND sku NOT IN (SELECT sku FROM main_table);

编辑

抱歉,没有注意到第二个查询中名称为“d”的错误

【问题讨论】:

答案取决于 .sku 的 NULLability 及其唯一性和基数。顺便说一句:此查询的第三个版本使用NOT EXISTS() ALSO:相关名称d 未在第二个查询中定义。所以查询会失败,所以会是最快的。 您可以使用命令“EXPLAIN”来详细说明查询的执行计划——这可能会对您有所帮助:postgresql.org/docs/9.2/static/sql-explain.html @wildplasser 相关名称 d 未在第二个查询中定义。所以查询会失败,所以会是最快的。这真的很真实也很有趣。 :) 更有趣的是:它将在恒定时间内运行,与数据的结构、大小和分布无关! 【参考方案1】:

重写查询可能会有所帮助,但我会首先检查 main_table 和 reseller_product 是否在 sku 上都有索引。搜索(和连接)非索引字段的复杂度为 O(n),而索引字段的复杂度为 O(log(n)) 或常量,具体取决于索引实现。

【讨论】:

【参考方案2】:

第三版:

UPDATE reseller_product u
SET status = 3
WHERE u.distributor_id = '||distrID||'
  AND u.reseller_id = '||resID||' 
  AND NOT EXISTS (
    SELECT * FROM main_table m
    WHERE m.sku = u.sku
    );

【讨论】:

以上是关于这两个sql查询语句哪个更快?的主要内容,如果未能解决你的问题,请参考以下文章

在Oracle数据库条件查询语句中使用'%%','_%%'这两个有啥区别

where条件放在子SQL语句中是否查询速度更快?

怎么优化mysql查询语句

SQL语句——09多表查询

SQL里if语句和case语句有啥区别吗?哪个使用更高效?就是查询更优化?

sql语句:将两个查询结果关联显示