为啥两个查询之间的性能差异?

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 是什么? 很快会在一两天后再次发布新的统计数据,希望你能回复。

以上是关于为啥两个查询之间的性能差异?的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试提高查找两个表之间差异的 Oracle SQL 的性能

Mysql查询性能(2个查询之间的差异)[重复]

两个sql查询的性能差异?

CTE、子查询、临时表或表变量之间是不是存在性能差异?

您如何解释这两个查询的性能差异?

SQLITE 3.7.13 和 3.8.0 之间的性能差异