代码之家  ›  专栏  ›  技术社区  ›  Ashish Agarwal

为什么这两个查询的性能不同?

  •  0
  • Ashish Agarwal  · 技术社区  · 16 年前

    我使用的是SQLServer2008,我有两个表

    包含350万条记录

    +----+-------------+
    | pk | dim1        |
    +----+-------------+
    indexing applied on column **pk**
    

    表2

    包含1500万条记录

    +----+-------------+
    | fk | fact1       |
    +----+-------------+
    indexing applied on column **fk**
    

    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比Query1快,不幸的是,我不记得它的时间。

    有人能解释为什么Query2更快吗?

    1 回复  |  直到 16 年前
        1
  •  4
  •   gbn    16 年前

    6秒对7秒很容易成为测量误差

    • 运行这两个程序,查看实际的执行计划
    • 运行几次并比较计时

    观察:你应该使用这个结构

    Select t2.fact1 from
        Table1 as t1 JOIN table2 as t2 on t2.fk=t1.pk
    

    编辑:

    • DBCC DROPCLEANBUFFERS将清除数据缓存

    当然,现在我意识到这一差异将是由查询1给出不同的结果造成的,因为行数相乘。也就是说,每个父行有多个子行。警察不会这么做的。