寻求谓词与谓词之间的区别


12

我正在尝试性能调整SQL Server 2014 Enterprise中的查询。

我已经在SQL Sentry Plan Explorer中打开了实际的查询计划,并且可以在一个节点上看到它具有Seek谓词Predicate。

Seek谓词Predicate有什么区别?

在此处输入图片说明

注意:我可以看到此节点存在很多问题(例如,估计行与实际行,剩余IO),但问题与任何这些都不相关。


3
查找谓词有助于进行连接,仅过滤到在另一个表(已编辑)中也找到的行。谓词(残留谓词)然后消除了与2的特定状态的行
亚伦贝特朗

5
罗伯·法利(Rob Farley)在这里的评论中说了以下几点The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
亚伦·伯特兰

Answers:


18

让我们将一百万行和几列放入一个临时表中:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (PK)
);

INSERT INTO #174860 WITH (TABLOCK)
SELECT RN
, RN % 1000
, RN % 10000
FROM 
(
    SELECT TOP 1000000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) RN
    FROM   master..spt_values v1,
           master..spt_values v2
) t;

CREATE INDEX IX_174860_IX ON #174860 (COL1) INCLUDE (COL2);

在这里,我在PK列上有一个聚集索引(默认情况下)。有一个非聚集索引COL1,其键列为,COL1包括COL2

考虑以下查询:

SELECT *
FROM #174860
WHERE PK >= 15000 AND PK < 15005
AND COL2 = 5000;

在这里我没有用,BETWEEN因为亚伦·贝特朗一直在围绕这个问题。

SQL Server优化器应如何查询?好吧,我知道启用筛选器PK会将结果集减少到五行。SQL Server可以使用聚簇索引跳到那五行,而不用读取表中的所有百万行。但是,聚集索引仅将PK列作为键列。将行读入内存后,我们需要在上应用过滤器COL2。在这里,PK是一个搜索谓词,COL2也是一个谓词。

在此处输入图片说明

SQL Server使用查找谓词查找五行,并使用常规谓词将这五行进一步减少为一行。

如果我以不同的方式定义聚簇索引:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (COL2, PK)
);

并运行相同的查询,我得到不同的结果:

在此处输入图片说明

在这种情况下,SQL Server可以在WHERE子句中使用这两个列。使用键列从表中仅读取一行。

再看一个示例,请考虑以下查询:

SELECT *
FROM #174860
WHERE COL1 = 500
AND COL2 = 3545;

IX_174860_IX索引是覆盖索引,因为它包含查询所需的所有列。但是,只有COL1一个键列。SQL Server可以在该列中查找以找到具有匹配COL1值的1000行。它可以进一步过滤列中的那些行,COL2以将最终结果集减少为0行。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.