假设我有以下列
InsertedTime DateTime not null
ItemType tinyint not null
ItemType in {0, 1, 2, 3, 4, ... , 255}
我有一个查询,如果按InsertedTime
索引,它何时会运行得最快:where InsertedTime > Monday and InsertedTime < Tuesday
但是,我还希望在DateRange中使用ItemType进行查询,假设所有行都使用ItemType == 0 and InsertedTime > Monday and InsertedTime < Tuesday
。
对于第一个查询,索引为{InsertedTime, ItemType}
是有意义的。但是,如果我对第二个查询使用此索引,sql将需要扫描整个日期范围结果。
为了优化第二个查询,我将使用{ItemType, InsertedTime}
索引。但是使用这个索引,sql将需要256次查找才能进行第一次查询。
有没有一种方法可以使用一个索引同时优化两个查询?
发布于 2017-10-28 11:21:55
如果您想要按“星期一”或“星期二”进行有效的过滤,您就会遇到一个问题,因为这些列只能由datename(weekday,InsertedTime)
访问,并且您不能将其用作持久化计算列,因为它是“非确定性”的,因为它依赖于语言设置,甚至datepart(weekday,InsertedTime)
也会受到影响,因为它依赖于firstday
设置。
要获得可以持久化的星期(0 =星期一)的可靠整数表示,可以尝试:
alter table Table1
add InsertedWeekday as (datediff(day,0,InsertedTime)%7) persisted;
如果确实需要的话,您可能还可以根据相同的逻辑创建一个case表达式来获取日期名称标签。
然后,被说服的计算列可以被包括在索引中,例如
create index ixWeekdayType on Table1 (InsertedWeekday,ItemType);
这可能有助于这种类型的查询:
select *
from Table1
where InsertedWeekday in (0,1) -- Monday/Tuesday
and ItemType between 20 and 30
不是我推荐它,但以下是“确定性”的,因此是允许的:
alter table Table1
add InsertedWeekdayName as (case datediff(day,0,InsertedTime)%7
when 0 then 'Monday'
when 1 then 'Tuesday'
when 2 then 'Wednesday'
when 3 then 'Thursday'
when 4 then 'Friday'
when 5 then 'Saturday'
when 6 then 'Sunday'
end
) persisted;
https://stackoverflow.com/questions/46982986
复制相似问题