这两个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万条以上。
我觉得不该从联合查询的角度考虑。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数据库条件查询语句中使用'%%','_%%'这两个有啥区别