ユーザーの入力に従って、フィルタリング、順序付け、およびページングを行う必要があるクエリに取り組んでいます。今、私は本当に遅いケースをテストしています。クエリ プランを調べると、「並べ替え」に 96% の時間がかかっています。
データモデルはそれほど複雑ではありません。次のクエリは、何が起こっているかを理解するのに十分明確です。
WITH OrderedRecords AS (
SELECT
A.Id
, A.col2
, ...
, B.Id
, B.col1
, ROW_NUMBER() OVER (ORDER BY B.col1 ASC) AS RowNumber
FROM A
LEFT JOIN B ON (B.SomeThing IS NULL) AND (A.BId = B.Id)
WHERE (A.col2 IN (...)) AND (B.Id IN (...))
)
SELECT
*
FROM OrderedRecords WHERE RowNumber Between x AND y
A は約 10 万件のレコードを含むテーブルですが、フィールド内で数千万件に増加します。一方、B は 5 つの項目を持つカテゴリ タイプのテーブルです (これは、おそらくそれ以上に大きくなることはありません)。A.Id と B.Id にはクラスター化インデックスがあります。
パフォーマンスは本当にひどいので、どうにかしてこれを改善できないかと考えています。たとえば、順序が B.col1 ではなく A.Id にある場合、すべてが非常に高速です。おそらく、B.col1 はある種のインデックスを最適化できます。
フィールド自体にインデックスを付けようとしましたが、これは役に立ちませんでした。おそらく、テーブル B の個別の項目の数が非常に少ないためです (それ自体および A と比較して)。
何か案は?