8

最近、SQL の実行計画を調べて、SQL のパフォーマンスを判断する必要があるという話をよく耳にします。ただし、この機能をどこから始めればよいのか、正確には何を意味するのかはよくわかりません。

実行計画が何をするのか、その制限は何か、それをどのように利用できるのか、または実行計画を実行するリソースへの指示についての適切な説明を探しています。

4

7 に答える 7

4

サーバーがデータを取得するために使用する実際のアルゴリズムについて説明します。

次の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

、同じことを行い、理論的には同じアルゴリズムを使用して実行する必要があります。

ただし、実際のエンジンは、同じアルゴリズムを実装するために前者のクエリを最適化することはありません。つまり、カウンターを変数に格納してインクリメントします。

行を何度も何度も数えます。

クエリを最適化するには、舞台裏で何が起こっているかを実際に確認する必要があり、それが実行計画によって示されます。

私のブログでこの記事を読みたいと思うかもしれません:

于 2010-01-29T15:25:41.333 に答える
2

ここここにいくつかの記事があります。チェックしてください。実行計画を使用すると、時間がかかる領域を特定できるため、クエリを改善できます。

于 2010-01-29T15:25:55.360 に答える
1

これらを理解するのに役立つ優れたリソースがあります http://downloads.red-gate.com/ebooks/HighPerformanceSQL_ebook.zip

これは、優れたSQLサーバーツールを作成している会社であるred-gateによるもので、無料で、ダウンロードして読む価値があります。

于 2010-01-29T15:53:19.987 に答える
1

これを容易にする方法は、SQL Management Studio で一部のクエリに対して "Ctrl L" (クエリ | 推定実行計画の表示) を使用することです。

これにより、実行計画のグラフィック ビューが表示されます。最初は、テキスト バージョンよりも「デコード」が容易です。

クエリ プランの簡単な説明:
基本的に、クエリ プランは、SQL Server がクエリの解決に使用する方法を示します。
単純なクエリであっても、実際には多くのオプションがあります。
たとえば、JOIN を扱う場合、「テーブル A」の [フィルタリングされた] 行をループして「テーブル B」の行を検索するか、代わりに「テーブル B」を最初にループするかを決定する必要があります (これはJOIN を処理するために使用できる他の多くのトリックがあるため、簡略化された例)。通常、SQL は、いずれかのテーブルによって生成される [フィルター処理された] 行の数を推定し、外側のループのカウントが最も小さい行を選択します (これにより、他のテーブルでのルックアップの数が減るため)
。使用する (または使用しない) インデックスを決定します。

クエリ プランをより詳細に説明しているオンライン リソースや本は数多くありますが、難点は、SQL パフォーマンスの最適化が非常に広範で複雑な問題であることです。クエリの [重要な] 詳細の多くに飛び込む前に、まずSQL Server の基礎となる基本原則と構造 (インデックスの動作方法、データの格納方法、クラスター化インデックスとヒープの違いなど) を理解する必要があります。最適化。それは野球に少し似ています: ゲームの戦略に関連するすべての微妙な [そして重要な] 概念を理解する前に、まずルールを知る必要があります。

追加のポインタについては、この関連するSO の質問を参照してください。

于 2010-01-29T15:25:06.717 に答える
1
  1. 実行計画は、SQL Server がクエリをどのように処理するかを正確に示します
  2. これは、SQL Server が行うクエリ最適化プロセスの一部として生成されます。直接作成するものではありません。
  3. 使用するのに最適であると判断したインデックスが表示されます。基本的には、SQL サーバーがクエリを処理する方法の計画です。
  4. クエリオプティマイザーはクエリを取得して分析し、さまざまな実行計画を作成する可能性があります。これはコストベースの最適化プロセスであり、最適と思われるものを選択します。
  5. 実行プランが生成されると、それはプラン キャッシュに格納されるため、同じクエリの後続の呼び出しで同じプランを再利用できるため、プランを作成するために作業をやり直す必要がなくなります。
  6. 実行プランは、その値に応じてキャッシュから自動的に削除されます (最大のパフォーマンスを得るために、価値の高いプランが削除される前に、価値の低いプランが削除されます)。
  7. 実行計画は、インデックスが欠落している場所などのパフォーマンスの問題を特定するのに役立ちます
于 2010-01-29T15:30:46.427 に答える
0

それは知識の非常に重要な部分です。そして、それに関する特別なトレーニングコースを強くお勧めします。コースで1週間過ごした後、私はクエリのパフォーマンスを約1000回向上させました(懐かしさ)

于 2010-01-29T15:26:18.073 に答える
0

実行計画は、データベースがクエリに必要なデータをどのように取得、ソート、およびフィルタリングしているかを示します。

例えば:

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 を満たすことを示す実行計画になります。

このことから、インデックスを確認することが有益であるか、別の方法で高速化できるかどうかなど、クエリの速度を低下させている原因を突き止めることができます。

于 2010-01-29T15:31:31.230 に答える