[英]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.