我們正在使用SQLServer 2008,並對許多表具有「只插入」模式。適用於「僅插入」模式的SQL服務器索引
的排序表中,我們已經是一個例子(這只是一個例子):
create table spotquotes
(
Id numeric(19,0) identity(1,1) not null primary key clustered,
feeditem_id numeric(19,0) not null,
value_ask float not null,
value_bid float not null,
effectiveDateUTC datetime not null default getutcdate()
)
我們則與此查詢
select * from spotquotes q
inner join
(select feeditem_id, max(id) as latest from spotquotes group by feeditem_id) q2
on q.id = q2.latest and q.feeditem_id = q2.feeditem_id
其實查詢表,它有必要創建上述查詢的觀點:
create view latestspotquotes as
select * from spotquotes q
inner join
(select feeditem_id, max(id) as latest from spotquotes group by feeditem_id) q2
on q.id = q2.latest and q.feeditem_id = q2.feeditem_id
即我們想要的「最新」插入到表中的每個費ditem_id - 但我們也有能力查詢過去任何時候的表的狀態(這對於審計考慮非常好)。
一個更簡單的方法來說明。我希望優化以下查詢:
select feeditem_id, max(id) as latest from spotquotes group by feeditem_id
此表通常有數億行的 - 但少數feeditem_id情況下,這很可能是在表的末尾的。
使用此表中的現有主鍵和約1億行,SQL Server 2008需要6秒鐘才能執行此查詢 - 速度非常慢。
所以我想知道 - 如果我們要爲這個表創建一個索引來加速這個查詢,我們應該創建什麼索引?
不幸的是,管理工作室並沒有爲我們建議索引。
編輯:仍有問題,但我會提出作爲一個單獨的問題。
UPDATE
更快的查詢(< 10毫秒)可以通過使用「交叉應用」連同選擇頂部* ... ORDER BY編號降序被哄騙了SQL服務器。詳細信息請參見Convincing SQL server to search backwards on clustered index for an insert only schema。
'(選擇feeditem_id,MAX(ID)的最新作ID)' - 你確定這是正確的? – dean
您的嵌套查詢位於同一個表或不同的表上? – raholling
raholling - 這是同一張桌子。 –