データをプルしてサービスにキャッシュする動的SQLクエリを作成するデータロードシナリオがあります。すべての製品データを含む1つのテーブルがあります:ProductHistory(47列、200,000レコード+そして今後も増え続ける)
必要なもの: 最大ID、最大バージョン、最大変更IDを使用して最新の製品を入手してください。
最初の試み:
SELECT distinct Product.* FROM ProductHistory product
WHERE product.version =
(SELECT max(version) from ProductHistory p2 where product.Id = p2.Id
and product.changeId =
(SELECT max(changeid) from ProductHistory p3 where p2.changeId = p3.changeId))
これには2.51分以上かかりました。
その他の失敗した試み:
select distinct product.* from ProductHistory product
where CAST(CAST(id as nvarchar)+'0'+CAST(Version as nvarchar)+'0'+CAST(changeid as nvarchar) as decimal) =
(select MAX(CAST(CAST(id as nvarchar)+'0'+CAST(Version as nvarchar)+'0'+CAST(changeid as nvarchar) as decimal)) from ProductHistory p2
where product.Id = p2.Id)
基本的に、日付を注文するときと同じ原則を使用し、関連性の高い順に番号を連結します。
For example 11 Jun 2007 = 20070711
And in our case: Id = 4 , version = 127, changeid = 32 => 40127032
The zeros are there not to mix up the 3 different ids
しかし、これは3.10分かかります!!! :(
したがって、基本的に、最初の試行クエリを万が一改善する方法が必要です。また、このような量のデータについても疑問に思っていましたが、これは私が期待する最高の検索速度ですか?
sp_helpindex ProductHistoryを実行し、以下のようにインデックスを見つけました。
PK_ProductHistoryNew-PRIMARY- Id、バージョンにあるクラスター化された一意の主キー
最初のクエリをSPでラップしましたが、それでも変更はありません。
では、他にどのような方法でこの操作のパフォーマンスを向上させることができるのでしょうか。
ありがとう、Mani ps:時間を確認するためにSQLManagementStuidoでこれらのクエリを実行しています。