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

时间:2013-12-18 16:23:42

标签: sql sql-server-2008 indexing

我有一个看起来像的查询:

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将只使用过滤索引。如果内部查询放在内联函数中,则结果类似。如果我没有将它放在内联函数中,则两个索引都可以工作,查询速度非常快。

2 个答案:

答案 0 :(得分:0)

在SSMS(SQL Server Management Studio)中运行查询并要求它生成查询计划。它提供了有关索引的提示,这些索引有助于并且实际上相当不错。除此之外,@marc_s听起来很明智,但我还是先在SSMS中试一试。

答案 1 :(得分:0)

您已经拥有的索引可能会用于选择过程 - 因为其中有x, y, z作为最左侧的列进行查询。

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

我建议你在(x, y, z)上为选择创建一个索引,在(b, c)上创建第二个单独的索引来排序结果。