性能:两个查询之间有什么区别

use*_*839 5 sql sql-server-2008

我原本写了以下内容

SELECT t1.TransactionNumber
FROM t1
    JOIN
    (
          SELECT MAX(id) id
          FROM t1
          WHERE Period BETWEEN '01-11-2013' and '01-12-2014'
          GROUP BY AccountNumber
    ) t2
        on t1.id= t2.id
Run Code Online (Sandbox Code Playgroud)

但它太慢了.花了大约20秒,所以作为测试,我将其更改为以下内容

 SELECT MAX(id) AS id
 INTO #t2
 FROM t1
 WHERE Period BETWEEN '01-11-2013' and '01-12-2014'
 GROUP BY AccountNumber

 SELECT t1.id 
 FROM t1
    JOIN #t2 t2
        ON t1.id= t2.id
Run Code Online (Sandbox Code Playgroud)

第二个查询仅运行1秒.第二个查询使用PK密钥执行索引查找,而第一个键执行扫描.

注意:id是聚集在t1表上的主键.

Sta*_*avL 0

你不能把所有的条件都放在ON部分吗?

SELECT t1.id
FROM t1
    JOIN
    (
          SELECT id
          FROM t1
          WHERE <condition>
    ) t2
        on t1.id = t2.id;
Run Code Online (Sandbox Code Playgroud)

被转化为

SELECT t1.id
FROM t1
     JOIN t1 as t2
        ON t1.id = t2.id AND <condition>
Run Code Online (Sandbox Code Playgroud)

更新:

检索每个组中的最后一条记录 该链接显示如何检索组中的最后一条记录。SQL如下

SELECT m1.*
FROM messages m1 LEFT JOIN messages m2
 ON (m1.name = m2.name AND m1.id < m2.id)
WHERE m2.id IS NULL;
Run Code Online (Sandbox Code Playgroud)

你可以使用这个而不是group by