过滤后的非聚集索引

时间:2018-08-22 17:28:00

标签: sql-server tsql

在这种情况下,筛选出的非聚集索引是否存在任何性能问题?

我有一个包含10列的堆表:

Create table Test()
{
    Field1 INT,
    Field2 INT,
    Field3 UNIQUEIDENTIFER,
    Field4 DATETIME,
    Field5 DATETIME,
    Field6 DATETIME,
    Field7 INT,
    Field8 INT,
    Field9 INT,
    Field10 INT 
}

最终用户可以使用以下查询语句从该表中获取报告:

select Field1, Field2 
from Test 
Where Field4 between @Date1 And @Date2 

Test是一个具有数百万行的大型表。

我想像这样在表上创建过滤的非聚集索引:

CREATE NONCLUSTERED INDEX IX_Field4 
ON Test (Field4)
WHERE Field4 <= @FirstDateOfYear AND Field4 >= @LastDateOfYear 

@Date1@Date2参数可以是不同年份或同一年中的任何日期,但通常这两个参数位于当年。

@firstDateOfYear@LastDateOfYear参数是固定的,它们引用了当年的第一个和最后一个日期。

是否存在任何性能问题,您认为SQL Server会随时使用我的索引吗?

假设我无法更改此表结构,例如在表Test上创建聚集索引,诸如此类

2 个答案:

答案 0 :(得分:0)

尝试:

  1. 在表中创建Field11 INT

  2. 填充Field11 = MillisecondsOf(Field4)

  3. 像这样按表查找

    select Field1, Field2 
    from Test 
    where Field11 <= MillisecondsOf(@Date1) 
      and Field11 >= MillisecondsOf(@Date2) 
    

答案 1 :(得分:0)

也请忽略我之前的评论。您不能在过滤索引上使用之间。

CREATE NONCLUSTERED INDEX IX_Field4 
ON Test (Field4)
INCLUDE ([Field1], [Field2])
WHERE Field4 <= @FirstDateOfYear AND Field4 >= @LastDateOfYear