0

我有一个很大的 select 语句,索引扫描占用了 83% 的时间,当有 700k 行时,它需要很多秒才能返回。我在这里做了一个子集:

set nocount on
create table #scanme ( lookid int identity primary key , stateid tinyint )
create nonclustered index scanstateid on #scanme (stateid) where stateid in ( 0 )
go
insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 0 )
go
insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 0 )
go
insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 0 )
go
insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 0 ) ; insert into #scanme values ( 1 ) ; insert into #scanme values ( 2 ) ; insert into #scanme values ( 0 )
go
select 
    sum( case when stateid=0 then 1 else 0 end ) as notdone
  , sum( case when stateid=1 then 1 else 0 end ) as doneok
  , sum( case when stateid=2 then 1 else 0 end ) as doneerrors
from
  #scanme

如果你现在在 SSMS 中运行它,你将不会看到我得到的相同计划,上面的 DML 只是为了说明我的问题所在。对于 700k 行,总和要求显然会导致索引扫描,因为 MSSQL 会查看每个 stateid 并将其相加。

任何人都可以推荐一个不同的索引(或如何改变我的选择),这将使这个查询快速返回?

谢谢。

4

0 回答 0