为啥两个查询之间的性能差异?
Posted
技术标签:
【中文标题】为啥两个查询之间的性能差异?【英文标题】:Why difference in performance between the TWO queries?为什么两个查询之间的性能差异? 【发布时间】:2010-07-31 11:57:49 【问题描述】:我使用的是 SQL Server 2008,我有两个表
表 1
包含 350 万条记录
+----+-------------+
| pk | dim1 |
+----+-------------+
indexing applied on column **pk**
表2
包含 1500 万条记录
+----+-------------+
| fk | fact1 |
+----+-------------+
indexing applied on column **fk**
我对这些表运行了 2 次查询以获取 t2.fact1
查询1
SELECT t2.fact1
FROM Table1 AS t1, Table2 AS t2
WHERE t2.fk = t1.pk
查询2
SELECT t2.fact1
FROM Table1
WHERE t2.fk IN (SELECT t1.pk FROM Table1 AS t1)
得到的结果是 Query1 取了 7 secs
而 Query2 取了 6 secs
如果我在上面的查询中使用IN
,虽然我在博客中阅读的某些地方会减慢查询速度。
问题#1:谁能提出为什么 Query2 更快?
在同一张表的另一个实验中(当没有应用索引时)我运行了上面的查询,并且 query2 再次比 Query1 快,不幸的是不记得它的时间了。
问题#2:谁能指出为什么 Query2 更快?
【问题讨论】:
【参考方案1】:6 秒 vs 7 秒很容易出现测量误差
运行两者并查看实际执行计划 运行多次并比较时间 第二个查询可以使用缓存中的数据运行,第一个查询不能。使用 DBCC DROPCLEANBUFFERS观察:你应该使用这个结构
Select t2.fact1 from
Table1 as t1 JOIN table2 as t2 on t2.fk=t1.pk
编辑:
DBCC DROPCLEANBUFFERS 将清除数据缓存 JOIN 语法更好更清晰当然,现在我意识到差异将是由于查询 1 由于乘以行而给出不同的结果造成的。也就是说,每个父行有多个子行。 In 不会这样做。
我通常会继续讨论这一点,但之前忽略了它。
我现在想知道的是每个查询返回多少行...
【讨论】:
1) 作为一些新事物无法解释执行计划,请指导我。 2)跑了几次,但结果是一样的。 3) 这个 DBCC DROPCLEANBUFFERS 是什么? 很快会在一两天后再次发布新的统计数据,希望你能回复。以上是关于为啥两个查询之间的性能差异?的主要内容,如果未能解决你的问题,请参考以下文章