【问题标题】: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 更快?

【问题讨论】:

    标签: sql sql-server-2008 performance


    【解决方案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 是什么?
    • 很快会在一两天后再次发布新的统计数据,希望你能回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多