Slow SQLクエリを読んだ後、最適化の方法がわからないので、クエリの一般的なパフォーマンスについて考えるようになりました。クエリをわずかに高速化するために、結合する前に(他のテーブルを結合する場合)最初のテーブルの結果をできるだけ小さくする必要があります(この質問の内部結合)。
例、これが必要です:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
以下より良く/速くなる
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
私の理論は次のとおりです(これは正しい実装ではないかもしれません。私が読んだSQL Server 2008の内部の本(MSFT Press)から思い出そうとしています)。
- クエリプロセッサは最初に左側のテーブル(table1)を取得します
- 2番目のテーブル(table2)を結合し、必要な行をフィルタリングする前にデカルト積を形成します(該当する場合)
- 次に、SEELCTステートメントを使用してWHERE、ORDER BY、GROUP BY、HAVING句を最後に実行します。
したがって、上記のステートメント#1でテーブルが小さい場合、SQLエンジンはデカルト積を形成するときに行う作業が少なくなります。その後、whereステートメントに到達すると、メモリ内でフィルタリングする結果セットが減少します。
それは現実的ではありません。私が言ったように、それは理論です。
あなたの考え?
注:私はこの質問について考えただけで、まだ自分でテストを実行する機会がありません。
注2:MySqlなどの実装について何も知らないので、SQL Serverとしてタグ付けされています。とにかく回答/コメントしてください