簡體   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