最近、SQL の実行計画を調べて、SQL のパフォーマンスを判断する必要があるという話をよく耳にします。ただし、この機能をどこから始めればよいのか、正確には何を意味するのかはよくわかりません。
実行計画が何をするのか、その制限は何か、それをどのように利用できるのか、または実行計画を実行するリソースへの指示についての適切な説明を探しています。
最近、SQL の実行計画を調べて、SQL のパフォーマンスを判断する必要があるという話をよく耳にします。ただし、この機能をどこから始めればよいのか、正確には何を意味するのかはよくわかりません。
実行計画が何をするのか、その制限は何か、それをどのように利用できるのか、または実行計画を実行するリソースへの指示についての適切な説明を探しています。
サーバーがデータを取得するために使用する実際のアルゴリズムについて説明します。
次のSQL
ようなクエリ:
SELECT *
FROM mytable1
JOIN mytable2
ON …
GROUP BY
…
ORDER BY
…
、何をすべきかを説明していますが、どのようにすべきかは説明していません。
実行計画は、使用されるインデックス、選択される結合方法(ネストされたループまたはハッシュ結合またはマージ結合)、結果がどのようにグループ化されるか (ソートまたはハッシュを使用)、それらがどのように順序付けられるかなどを示します。
残念ながら、最新のSQL
エンジンでさえ、多かれ少なかれ複雑なクエリの最適な計画を自動的に見つけることはできません。SQL
開発者は、パフォーマンスが向上するようにクエリを再構築する必要があります (元のクエリと同じことを行う場合でも)。
古典的な例は、これらもクエリです。
SELECT (
SELECT COUNT(*)
FROM mytable mi
WHERE mi.id <= mo.id
)
FROM mytable mo
ORDER BY
id
と
SELECT RANK() OVER (ORDER BY id)
FROM mytable
、同じことを行い、理論的には同じアルゴリズムを使用して実行する必要があります。
ただし、実際のエンジンは、同じアルゴリズムを実装するために前者のクエリを最適化することはありません。つまり、カウンターを変数に格納してインクリメントします。
行を何度も何度も数えます。
クエリを最適化するには、舞台裏で何が起こっているかを実際に確認する必要があり、それが実行計画によって示されます。
私のブログでこの記事を読みたいと思うかもしれません:
これらを理解するのに役立つ優れたリソースがあります http://downloads.red-gate.com/ebooks/HighPerformanceSQL_ebook.zip
これは、優れたSQLサーバーツールを作成している会社であるred-gateによるもので、無料で、ダウンロードして読む価値があります。
これを容易にする方法は、SQL Management Studio で一部のクエリに対して "Ctrl L" (クエリ | 推定実行計画の表示) を使用することです。
これにより、実行計画のグラフィック ビューが表示されます。最初は、テキスト バージョンよりも「デコード」が容易です。
クエリ プランの簡単な説明:
基本的に、クエリ プランは、SQL Server がクエリの解決に使用する方法を示します。
単純なクエリであっても、実際には多くのオプションがあります。
たとえば、JOIN を扱う場合、「テーブル A」の [フィルタリングされた] 行をループして「テーブル B」の行を検索するか、代わりに「テーブル B」を最初にループするかを決定する必要があります (これはJOIN を処理するために使用できる他の多くのトリックがあるため、簡略化された例)。通常、SQL は、いずれかのテーブルによって生成される [フィルター処理された] 行の数を推定し、外側のループのカウントが最も小さい行を選択します (これにより、他のテーブルでのルックアップの数が減るため)
。使用する (または使用しない) インデックスを決定します。
クエリ プランをより詳細に説明しているオンライン リソースや本は数多くありますが、難点は、SQL パフォーマンスの最適化が非常に広範で複雑な問題であることです。クエリの [重要な] 詳細の多くに飛び込む前に、まずSQL Server の基礎となる基本原則と構造 (インデックスの動作方法、データの格納方法、クラスター化インデックスとヒープの違いなど) を理解する必要があります。最適化。それは野球に少し似ています: ゲームの戦略に関連するすべての微妙な [そして重要な] 概念を理解する前に、まずルールを知る必要があります。
追加のポインタについては、この関連するSO の質問を参照してください。
それは知識の非常に重要な部分です。そして、それに関する特別なトレーニングコースを強くお勧めします。コースで1週間過ごした後、私はクエリのパフォーマンスを約1000回向上させました(懐かしさ)
実行計画は、データベースがクエリに必要なデータをどのように取得、ソート、およびフィルタリングしているかを示します。
例えば:
SELECT
*
FROM
TableA
INNER JOIN
TableB
ON
TableA.Id = TableB.TableAId
WHERE
TableB.TypeId = 2
ORDER BY
TableB.Date ASC
データベースが TableA と TableB からレコードを取得し、それらを照合して JOIN を満たすようにし、フィルタリングして WHERE を満たすようにし、並べ替えて ORDER BY を満たすことを示す実行計画になります。
このことから、インデックスを確認することが有益であるか、別の方法で高速化できるかどうかなど、クエリの速度を低下させている原因を突き止めることができます。