1

今のところ 200 万レコードのテーブルがありますが、1 日あたり 50 万レコードずつ増加するため、このクエリを最適化したい

Select * from Forex where Id in 
(SELECT MAX(Id) FROM Forex GROUP BY Symbol having Symbol in 
(Select Distinct Symbol from Forex) )

NONCLUSTERED INDEX を作成したので、このクエリにかかる時間は 673 ミリ秒です。クエリを次のように変更しました

Select * from Forex where Id in 
(SELECT MAX(Id) FROM Forex GROUP BY Symbol having  Symbol in 
('AUDCAD','AUDCHF','AUDJPY','AUDNZD','AUDUSD','CADCHF','CHFJPY', 
'EURAUD','EURCAD','EURCHF','EURGBP','EURJPY','EURNOK','EURNZD', 
'EURUSD','GBPCAD','GBPCHF','GBPJPY','GBPUSD','NZDJPY','NZDUSD', 
'USDCAD','USDCHF','USDJPY','USDNOK','USDSEK'))

現在、所要時間は 391 ミリ秒です

100ミリ秒未満にすることは可能ですか?または、このクエリを最適化するための誰かの助け

4

2 に答える 2

0

HAVING句を取り除くことができるはずです:

Select * from Forex where Id in 
(SELECT MAX(Id) FROM Forex GROUP BY Symbol)

このバージョンを試すこともできます:

SELECT * FROM Forex F
WHERE Id =
(SELECT MAX(Id) FROM Forex WHERE Symbol = F.Symbol)

劇的に違うとは思いませんが。

いくつかの大まかなストローク (機能するものもあれば、機能しないものもあります):

  1. Idとに索引があることを確認してくださいSymbol, Id DESC。インデックスIdが CLUSTERED である場合、それも役立ちます。
  2. 必要がない場合は、すべての列を返さないでください。
  3. Symbol別の小さいテーブルに移動してテーブルを非正規化する
  4. メモリを追加
  5. CPU を追加
  6. より高速なハード ドライブを使用する
于 2013-07-09T13:09:22.357 に答える