提高查询性能

时间:2015-08-21 14:34:10

标签: sql-server tsql

我有下表用于文档存储。该文档可以是具有多个页面的书籍,从0开始的页面编号或单页文档。

Category
Title
PageNo - integer
LineNo integer
Key
Value

我需要一个查询,从表中提取属于单页文档和Category1的所有键。

我有以下查询:

SELECT DISTINCT Key 
FROM Materials
WHERE Category='Category1' and Key NOT IN 
(SELECT DISTINCT Key 
from Materials 
WHERE Category='Category1'
and PageNo>0)

查询工作正常,不包括所有超过1页的材料。我想重写查询以在性能方面改进它,并且如果可能的话,还要避免任何重复的代码,如关键字DISTINCT和WHERE子句。我很欣赏任何正确方向的指示。

2 个答案:

答案 0 :(得分:3)

如果PageNo不为空

SELECT Key 
FROM Materials
WHERE Category='Category1'
GROUP BY Key 
having  max(PageNo) <= 0

如果PageNo可以为空

SELECT Key 
FROM Materials
WHERE Category='Category1'
GROUP BY Key 
having  max(isnull(PageNo,0)) <= 0

答案 1 :(得分:1)

删除第二个DISTINCT

  • 添加DISTINCT将添加其他表扫描

查询应该是:

SELECT DISTINCT Key 
FROM Materials
WHERE Category='Category1'
 and Key NOT IN 
(SELECT Key 
from Materials 
WHERE Category='Category1'
and PageNo>0)