SQL Server - 同一列上的Predicate和Seek Predicate

时间:2017-07-20 04:34:51

标签: sql-server predicate

我的表有一个非聚集索引:IX_columnA_columnB

CREATE INDEX IX_columnA_columnB ON table (columnA, columnB)
    INCLUDE (xxx)

我的查询已对columnAcolumnB进行过滤 在执行计划中,优化程序对它们使用seek predicate,但我在columnB中再次显示predicate 我不知道这个案子。有人可以帮忙吗?非常感谢

1 个答案:

答案 0 :(得分:2)

您的查询谓词类似于

recommend Between 179764 and 26506209 and winlostdate >= '2017-07-12'

索引按逻辑顺序排列如下。

+-----------+-------------+------+----------+
| recommend | winlostdate | Seek | Residual |
+-----------+-------------+------+----------+
|    179764 | 2000-01-01  |      |          |
|    179764 | 2017-07-12  | Y    | Y        |
|    179765 | 2000-01-01  | Y    | N        |
|    179765 | 2017-07-12  | Y    | Y        |
|  26506209 | 2000-01-01  | Y    | N        |
|  26506209 | 2017-07-12  | Y    | Y        |
|  26506210 | 2000-01-01  |      |          |
+-----------+-------------+------+----------+

搜索谓词的起始谓词为(recommend, winlostdate) >= (179764, '2017-07-12'),并按顺序读取索引,直到达到最终条件且recommend <= 26506209不为真。

这是Seek = Y的连续范围。

但是,该范围包括两行与谓词不匹配的行。这些被winlostdate >= '2017-07-12'

上的残差谓词丢弃