我有一个看起来像的查询:
select top 1
a
, b
, c
from table
where x = 1
and y = 2
and z > getdate()
order by
b desc
, c desc
和索引如:
create index idx_ on table
(
x
, y
, z
, b
, c
)
include (a)
我的问题是,在过滤器后,我留下了大约6密耳的记录。并且SQL Server也不会根据索引进行排序,因此这个查询的时间非常长。
该计划如下:
select (0%) <- TOP N SORT (94%) <= INDEX SEEK (6%)
如何选择索引列,或者以这种方式更改选择,以便我可以从索引中受益。
此外,选择必须能够适合外部应用,这是不将其分解成碎片的主要原因。 x字段是外部选择链接的字段。
作为问题的更新,整个sql看起来像:
select
*
from #tmp_xs xs
outer apply
(select top 1
a
, b
, c
from table
where x = xs.rel_x
and y = 2
and z > getdate()
order by
b desc
, c desc) xs_res
由于某种原因,上面的查询sql server将只使用过滤索引。如果内部查询放在内联函数中,则结果类似。如果我没有将它放在内联函数中,则两个索引都可以工作,查询速度非常快。
答案 0 :(得分:0)
在SSMS(SQL Server Management Studio)中运行查询并要求它生成查询计划。它提供了有关索引的提示,这些索引有助于并且实际上相当不错。除此之外,@marc_s听起来很明智,但我还是先在SSMS中试一试。
答案 1 :(得分:0)
您已经拥有的索引可能会用于选择过程 - 因为其中有x, y, z
作为最左侧的列进行查询。
但它不能用于排序,因为排序列b
和c
不是该索引中最左侧的列。
我建议你在(x, y, z)
上为选择创建一个索引,在(b, c)
上创建第二个单独的索引来排序结果。