[英]Correct order of columns in an index in SQL Server
我有一个查询,看起来像:
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)
我的问题是,在筛选器之后,我剩下大约600万条记录。 而且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服务器将仅使用过滤索引。 如果将内部查询放在内联函数中,则结果类似。 如果我不将其放在内联函数中,则两个索引都可以工作并且查询非常快。
在SSMS(SQL Server Management Studio)中运行查询,并要求其生成查询计划。 它提供了有关索引的提示,这些索引实际上会非常有用。 除此之外,@ marc_s听起来很明智,但我仍然会先在SSMS中尝试一下。
您已经拥有的索引可能会用于选择过程-因为其中包含x, y, z
作为最左列进行查询。
但是,它不能用于排序,因为排序列b
和c
不是该索引中最左边的列。
我建议您在(x, y, z)
上创建索引以供选择,并在(b, c)
上创建第二个单独的索引以对结果进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.