私はSQLクエリを最適化しようとしていますが、常にこの1つの問題に戻り、これを最適化する方法についての洞察を得たいと思っていました。
簡潔にするために、単純な従業員テーブルがあるとします。
tbl_employees
Id HiredDateTime
------------------
1 ...
2 ...
これにより、従業員ごとに別のテーブルの情報がバージョン管理されました。
tbl_emplyees_versioned
Id Version Name HourlyWage
-------------------------------
1 1 Bob 10
1 2 Bob 20
1 3 Bob 30
2 1 Dan 10
2 2 Dan 20
そして、これは最新バージョンのレコードがビューで取得される方法です。
Select tbl_employees.Id, employees_LatestVersion.Name, employees_LatestVersion.HourlyWage, employees_LatestVersion.Version
From tbl_employees
Inner Join tbl_employees_versioned
ON tbl_employees.Id = tbl_employees_versioned.Id
CROSS APPLY
(SELECT Id, Max(Version) AS Version
FROM tbl_employees_versioned AS employees_LatestVersion
WHERE Id = tbl_employees_versioned.Id
GROUP BY Id) AS employees_LatestVersion
このような応答を取得するには:
Id Version Name HourlyWage
-------------------------------
1 3 Bob 30
2 2 Dan 20
500人を超える従業員レコードがあり、それぞれにいくつかのバージョンがあるクエリをプルすると、このクエリは窒息し始め、実行に数秒かかります。
すぐにいくつかのストライキがありますが、それらを克服する方法がわかりません。
明らかに、クロスアプライはパフォーマンスの低下をもたらします。このようなバージョン管理された情報を処理する際のベストプラクティスはありますか?最高バージョンのレコードだけを取得するためのより良い方法はありますか?
IdもVersionも一意ではないため、バージョン管理されたテーブルにはクラスター化インデックスがありません。連結するとそうなりますが、そのようには機能しません。代わりに、Id用の非クラスター化インデックスとVersion用の別のインデックスがあります。このテーブルにインデックスを付けてパフォーマンスを向上させるためのより良い方法はありますか?インデックス付きのビューはここで本当に役立ちますか?