こんにちは、各クエリが 35 以上のテーブルからデータを取得しているいくつかのレポートのクエリがいくつかあります。各テーブルには、ほぼ 100K のレコードがあります。たとえば、すべてのクエリは Union ALL です。
;With CTE
AS
(
Select col1, col2, col3 FROM Table1 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table2 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table3 WHERE Some_Condition
UNION ALL
Select col1, col2, col3 FROM Table4 WHERE Some_Condition
.
.
. And so on
)
SELECT col1, col2, col3 FROM CTE
ORDER BY col3 DESC
これまでのところ、Dev Server でこのクエリをテストしただけで、結果を得るのに時間がかかることがわかります。これらの 35 以上のテーブルはすべて互いに関連していません。これが、結果セット内のすべての必要なデータを取得するために考えられる唯一の方法です。
この種のクエリを実行するより良い方法はありますか??
これがこの種のクエリを実行する唯一の方法である場合、可能であれば変更を加えて、このクエリのパフォーマンスを向上させるにはどうすればよいですか??
私の意見
このレポートにいくつかの汚い読みがあってもかまいません。クエリヒント with nolock
を使用する か、Transaction Isolation Level
に設定することを考えていましたREAD UNCOMMITED
。
これは役に立ちますか???
Edit
Every Tableには5〜10個のビット列と各ビット列に対応する日付列があり、各SELECTステートメントの条件は次のようなものです
WHERE BitColumn = 1 AND DateColumn IS NULL
同僚による提案
フィルター処理されたインデックス
CREATE NONCLUSTERED INDEX IX_Table_Column
ON TableName(BitColumn)
WHERE BitColum = 1
列が含まれるフィルター処理されたインデックス
CREATE NONCLUSTERED INDEX fIX_IX_Table_Column
ON TableName(BitColumn)
INCLUDE (DateColumn)
WHERE DateColumn IS NULL
これが最善の方法ですか?または任意の提案をしてください???