2013-04-02 47 views
1

我有以下查詢可掃描大表遺憾的是我沒有索引此列,但往往我必須在此列運行查詢。有沒有一種方法可以優化這個查詢。sqlserver的查詢優化上大表

SELECT * FROM與匹配(NOLOCK)其中CURRENT_STATE在( 'ACT', 'REJ')這個表中

enter image description here

總記錄是30280527

如果我使用TOP子句來代替選擇所有記錄會提高性能嗎?

+2

那你爲什麼不設置一個索引,看看它是否有幫助? – CBroe

+0

我也有很多插入在這張表中,索引可能會導致性能問題。 –

回答

0

是的,如果你使用TOP子句能夠提高性能成正比行子句排除的數量。但是,您只會返回在TOP子句指定的範圍內的行。

不,您無法做任何事情來優化此查詢。這是如此簡單,沒有任何工作。你唯一的選擇是添加一個索引,並拒絕這樣做,斷言你有很多插入和性能會受到影響是愚蠢的。是的,索引確實會產生開銷,但與其性能收益相比,這種開銷是微不足道的。實際上,如果你在發生插入的同時運行上面的查詢,我懷疑掃描表所需的I/O和CPU的數量很可能會導致更多的性能損失而不是維護索引並尋求它的開銷。

如果您絕對必須保持表無索引(因爲您已經測試了性能並添加了索引並且結果不可接受),請考慮設置某種形式的複製,以便在無索引表的情況下接受插入,另一個表偶爾接收來自第一個表的數據,並將索引放在第二個表上並對其執行查詢。