繁体   English   中英

在SQL Server中索引中的列的正确顺序

[英]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作为最左列进行查询。

但是,它不能用于排序,因为排序列bc不是该索引中最左边的列。

我建议您在(x, y, z)上创建索引以供选择,并在(b, c)上创建第二个单独的索引以对结果进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM