SQLの最適化は、最適化されたSQL文の30種類をマスターする必要があります

オリジナルセルフ:https://www.cnblogs.com/Little-Li/p/8031295.html

あなたは、最適化されたSQL文の30種類をマスターする必要があります

 

1.「クエリの最適化は、全表スキャンを回避しようとしてください、あなたは最初の場所と順番に関与列でインデックス作成を検討すべきです。

2.そうでない場合は、エンジンがインデックスと全表スキャンを使用して放棄する、句!=または<>オペレータでは避けるべきです。

3.フィールドはNULL値に避けなければならないwhere句で決定され、エンジンがインデックスと全表スキャンを使用してあきらめさせる、などになります。

numがnullであるここで、tからIDを選択します

あなたは何のNULL値は、このクエリが存在しないことを保証するために、テーブル内のNUM、num個の列にデフォルト値の0を設定することができます。

ここでNUM T = 0からIDを選択

4.接続条件は、WHERE句では避けるか、使用しなければならない、それはエンジンがインデックスと全表スキャンを使用してあきらめてしまいます、例えば:

TからIDを選択してここでNUM = 10またはNUM = 20

クエリが実行できます。

TからIDを選択してここでNUM = 10

労働組合のすべて

TからIDを選択してここでNUM = 20

次のクエリは、全表スキャンになります。

どこ名「%ABC%」のようなトンからIDを選択します

効率を向上させるために、フルテキスト検索とみなすことができます。

6.inそれ以外の場合のような、全表スキャンにつながる、ないで注意して使用し、する必要があります。

Tここで、NUMに(1,2,3)からIDを選択

連続値については、あなたが間に使用することはできません。

TからNUM 1と3の間で選択ID

7. WHERE句のパラメータ場合は、全表スキャンにつながります。実行時にSQLがローカル変数のみを解決しますが、オプティマイザは、実行するアクセス・プランの選択を延期することはできませんので、それはコンパイル時に選択する必要があります。しかし、コンパイル時にアクセス・プランを確立する場合、変数の値が不明であるため、選択されたインデックスエントリとして使用することはできません。次の文のよう全表スキャンを実行します。

どこNUM = @ NUMトンからIDを選択します

インデックスを使用してクエリを強制的に変更することができます。

ここで、NUM = @ NUM(インデックス(索引名))を用いてTからIDを選択

8.フィールドはエンジンがインデックスと全表スキャンを使用してあきらめてしまいますWHERE句式、で動作するように避けるべきです。以下のような:

TからIDを選択する場合NUM / 2 = 100

お読みください:

* 2 NUM = 100トンからIDを選択

9.フィールドには、エンジンがインデックスと全表スキャンを使用してあきらめてしまいますWHERE句での機能動作に避けるべきです。以下のような:

名前ID ABCで始まる - サブストリング(名前、1,3)= 'ABC' がTからIDを選択します

'2005-11-30' 生成的ID - (日、CREATEDATE '2005-11-30')TここDATEDIFFから= 0 IDを選択

お読みください:

どこ名「ABC%」のようなトンからIDを選択します

ここCREATEDATE> = '2005-11-30' とCREATEDATE < '2005年12月1日' TからIDを選択

10. where句の関数、算術演算、またはその他の式を実行しない「=」左、またはシステムが適切に索引付け動作しない可能性があります。

インデックスは複合インデックスがある場合、あなたはシステムを確保するために、最初のフィールドにインデックスを使用する必要があり、インデックスフィールドを使用しての条件として11は、条件として、そうでない場合は、インデックスが使用されないインデックスを使用し、すべきですそのフィールドの順序は、順序インデックスと一致しているので、可能な限り。

12.は、空のテーブル構造を作成する必要として、クエリは意味がありません。書いてはいけません。

1 = 0 Tから#tをにCOL1、COL2を選択

このコードは、任意の結果セットを返しますが、システムリソースを消費し、これによって置き換える必要がありません。

(...)テーブルに#tを作成します

多くの場合、代わりに使用されている13。は良い選択です存在します。

(BからNUMを選択)でここでNUMからNUMを選択

次の文で置き換えます。

(ここで、NUM = a.num Bから1を選択)が存在するところからNUMを選択

テーブルなど14インデックス列は、データの重複をたくさん持っているときに、すべてのインデックスが有効なクエリ、SQLクエリの最適化は、テーブル内のデータに基づいて行われているわけではありません、SQLクエリはインデックスを使用して行ってないかもしれませんが、フィールドの性別、男性を持ち、各女性のほぼ半分、インデックスも性別にクエリ効率には影響を建てなくても。

15.インデックスが不可能である、対応するインデックスは確かに選択の効率を向上させることができますが、挿入または更新は、インデックスを再構築する時期が可能で、インデックスは慎重にどのように構築するために検討する必要があるため、また、挿入および更新の効率を低下させます場合であってもよいように。あまりにも多くのあなたはそれほど頻繁に必要に応じてインデックス列を構築するために使用されるのいくつかを検討する必要がある場合は、インデックス番号テーブルは、6よりも最善ではありません。

16.更新が可能なクラスタ化インデックスデータカラム、カラム限り避けるべきであるインデックスデータの順序がテーブルに記録された物理記憶順序をクラスタ化されているので、列がテーブル全体を記録するために調整値変化をもたらすであろうと、かなりのリソースを消費します。アプリケーションは、インデックスデータ列をクラスタ化された頻繁な更新が必要な場合は、それがクラスタ化インデックスのインデックスのために構築されるべきかどうかを検討する必要があります。

数値情報を含むフィールドのみが接続とクエリのパフォーマンスが低下し、ストレージコストを増加キャラクターデザイン、可能でない場合は17、数値フィールドを使用しています。一度だけ文字列内の各文字を比較することにより、クエリとの接続1を処理し、数値の比較のために、エンジンが十分にあるためです。

18.代わりに、CHAR / NCHARの可能な使用varchar型/ NVARCHAR、すべての可変長フィールドの小さな収納スペースの最初の、あなたは検索効率の比較的小さなフィールドで、クエリに続いて、ストレージスペースを節約することができるためには、明らかに高いです。

19.未満でフィールドのいずれかを返さない、代わりに「*」の分野の特定のリストで、任意の使用はトンSELECT * FROM置かないでください。

20.表の変数ではなく、一時テーブルを使用しています。テーブル変数は、大量のデータが含まれている場合は、インデックスが(主キーのみインデックス)非常に限られていることに注意してください。

21.避け頻繁には、資源の消費を減らすために、システムテーブルを作成し、一時テーブルを削除します。

22. A一時テーブルは、大きなテーブルまたはテーブルは、一般的に参照するに、データ・セットを複製する必要があるときには、例えば、より効率的な特定のルーチンを適切に利用することができ、使用不可能ではありません。しかし、1回限りのイベントのために、それは、エクスポートテーブルを使用するのが最適です。

23.一つは大量のデータを挿入する場合、新しい一時テーブルは、その代わりに速度を上げるために、ログの多くを回避するために、テーブルを作成するに選択を使用してもよい場合、もし、あるべきシステム・リソース・テーブルを容易にするために小さなデータ、挿入し、テーブルを作成します。

24.あなたは、ストアドプロシージャ、最初のtruncateテーブルの終了時に削除すべての一時テーブルを明示的に確認するために一時テーブルを使用する場合は、システムテーブルに長い時間をロックを避けるために、テーブルをドロップします。

25.カーソルの効率が悪いが、カーソル操作10,000以上のラインならば、あなたは書き換え考慮しなければならないので、カーソルを使用しないようにしてください。

26.あなたが問題を解決するためにセットベースのソリューションを探す必要があり、一時テーブルに基づくメソッドまたはメソッドの前にカーソルを使用して、通常より効率的なセットベースの方法。

27.一時テーブル、カーソルは使用不可能ではありません。小さなデータセットに使用FAST_FORWARDカーソルは、特にいくつかのテーブルを参照して必要なデータを得るためにある必要があり、通常、他の進歩的な治療法よりも優れています。結果セット内の速いカーソルの速度を用いて行う通常のルーチンより「全」を含みます。開発時間が許せば、カーソルベースの方法と優れている方法を参照しようとするベースのアプローチを設定することができます。

すべてのストアド・プロシージャとトリガの開始時NOCOUNT ON SET 28セットは、SET NOCOUNT OFFは、端部に配置されました。DONE_IN_PROCは、各文を実行し、ストアドプロシージャをトリガされた後、クライアントにメッセージを送信する必要はありません。

29.避けてはデータが大きすぎる場合、あなたが対応する需要が合理的である検討すべき、クライアントに大量のデータが返されました。

30.システムの同時実行性を向上させ、大規模なトランザクション操作を避けるようにしてください。

1.「クエリの最適化は、全表スキャンを回避しようとしてください、あなたは最初の場所と順番に関与列でインデックス作成を検討すべきです。

2.そうでない場合は、エンジンがインデックスと全表スキャンを使用して放棄する、句!=または<>オペレータでは避けるべきです。

3.フィールドはNULL値に避けなければならないwhere句で決定され、エンジンがインデックスと全表スキャンを使用してあきらめさせる、などになります。

numがnullであるここで、tからIDを選択します

あなたは何のNULL値は、このクエリが存在しないことを保証するために、テーブル内のNUM、num個の列にデフォルト値の0を設定することができます。

ここでNUM T = 0からIDを選択

4.接続条件は、WHERE句では避けるか、使用しなければならない、それはエンジンがインデックスと全表スキャンを使用してあきらめてしまいます、例えば:

TからIDを選択してここでNUM = 10またはNUM = 20

クエリが実行できます。

TからIDを選択してここでNUM = 10

労働組合のすべて

TからIDを選択してここでNUM = 20

次のクエリは、全表スキャンになります。

どこ名「%ABC%」のようなトンからIDを選択します

効率を向上させるために、フルテキスト検索とみなすことができます。

6.inそれ以外の場合のような、全表スキャンにつながる、ないで注意して使用し、する必要があります。

Tここで、NUMに(1,2,3)からIDを選択

連続値については、あなたが間に使用することはできません。

TからNUM 1と3の間で選択ID

7. WHERE句のパラメータ場合は、全表スキャンにつながります。実行時にSQLがローカル変数のみを解決しますが、オプティマイザは、実行するアクセス・プランの選択を延期することはできませんので、それはコンパイル時に選択する必要があります。しかし、コンパイル時にアクセス・プランを確立する場合、変数の値が不明であるため、選択されたインデックスエントリとして使用することはできません。次の文のよう全表スキャンを実行します。

どこNUM = @ NUMトンからIDを選択します

インデックスを使用してクエリを強制的に変更することができます。

ここで、NUM = @ NUM(インデックス(索引名))を用いてTからIDを選択

8.フィールドはエンジンがインデックスと全表スキャンを使用してあきらめてしまいますWHERE句式、で動作するように避けるべきです。以下のような:

TからIDを選択する場合NUM / 2 = 100

お読みください:

* 2 NUM = 100トンからIDを選択

9.フィールドには、エンジンがインデックスと全表スキャンを使用してあきらめてしまいますWHERE句での機能動作に避けるべきです。以下のような:

名前ID ABCで始まる - サブストリング(名前、1,3)= 'ABC' がTからIDを選択します

'2005-11-30' 生成的ID - (日、CREATEDATE '2005-11-30')TここDATEDIFFから= 0 IDを選択

お読みください:

どこ名「ABC%」のようなトンからIDを選択します

ここCREATEDATE> = '2005-11-30' とCREATEDATE < '2005年12月1日' TからIDを選択

10. where句の関数、算術演算、またはその他の式を実行しない「=」左、またはシステムが適切に索引付け動作しない可能性があります。

インデックスは複合インデックスがある場合、あなたはシステムを確保するために、最初のフィールドにインデックスを使用する必要があり、インデックスフィールドを使用しての条件として11は、条件として、そうでない場合は、インデックスが使用されないインデックスを使用し、すべきですそのフィールドの順序は、順序インデックスと一致しているので、可能な限り。

12.は、空のテーブル構造を作成する必要として、クエリは意味がありません。書いてはいけません。

1 = 0 Tから#tをにCOL1、COL2を選択

このコードは、任意の結果セットを返しますが、システムリソースを消費し、これによって置き換える必要がありません。

(...)テーブルに#tを作成します

多くの場合、代わりに使用されている13。は良い選択です存在します。

(BからNUMを選択)でここでNUMからNUMを選択

次の文で置き換えます。

(ここで、NUM = a.num Bから1を選択)が存在するところからNUMを選択

テーブルなど14インデックス列は、データの重複をたくさん持っているときに、すべてのインデックスが有効なクエリ、SQLクエリの最適化は、テーブル内のデータに基づいて行われているわけではありません、SQLクエリはインデックスを使用して行ってないかもしれませんが、フィールドの性別、男性を持ち、各女性のほぼ半分、インデックスも性別にクエリ効率には影響を建てなくても。

15.インデックスが不可能である、対応するインデックスは確かに選択の効率を向上させることができますが、挿入または更新は、インデックスを再構築する時期が可能で、インデックスは慎重にどのように構築するために検討する必要があるため、また、挿入および更新の効率を低下させます場合であってもよいように。あまりにも多くのあなたはそれほど頻繁に必要に応じてインデックス列を構築するために使用されるのいくつかを検討する必要がある場合は、インデックス番号テーブルは、6よりも最善ではありません。

16.更新が可能なクラスタ化インデックスデータカラム、カラム限り避けるべきであるインデックスデータの順序がテーブルに記録された物理記憶順序をクラスタ化されているので、列がテーブル全体を記録するために調整値変化をもたらすであろうと、かなりのリソースを消費します。アプリケーションは、インデックスデータ列をクラスタ化された頻繁な更新が必要な場合は、それがクラスタ化インデックスのインデックスのために構築されるべきかどうかを検討する必要があります。

数値情報を含むフィールドのみが接続とクエリのパフォーマンスが低下し、ストレージコストを増加キャラクターデザイン、可能でない場合は17、数値フィールドを使用しています。一度だけ文字列内の各文字を比較することにより、クエリとの接続1を処理し、数値の比較のために、エンジンが十分にあるためです。

18.代わりに、CHAR / NCHARの可能な使用varchar型/ NVARCHAR、すべての可変長フィールドの小さな収納スペースの最初の、あなたは検索効率の比較的小さなフィールドで、クエリに続いて、ストレージスペースを節約することができるためには、明らかに高いです。

19.未満でフィールドのいずれかを返さない、代わりに「*」の分野の特定のリストで、任意の使用はトンSELECT * FROM置かないでください。

20.表の変数ではなく、一時テーブルを使用しています。テーブル変数は、大量のデータが含まれている場合は、インデックスが(主キーのみインデックス)非常に限られていることに注意してください。

21.避け頻繁には、資源の消費を減らすために、システムテーブルを作成し、一時テーブルを削除します。

22. A一時テーブルは、大きなテーブルまたはテーブルは、一般的に参照するに、データ・セットを複製する必要があるときには、例えば、より効率的な特定のルーチンを適切に利用することができ、使用不可能ではありません。しかし、1回限りのイベントのために、それは、エクスポートテーブルを使用するのが最適です。

23.一つは大量のデータを挿入する場合、新しい一時テーブルは、その代わりに速度を上げるために、ログの多くを回避するために、テーブルを作成するに選択を使用してもよい場合、もし、あるべきシステム・リソース・テーブルを容易にするために小さなデータ、挿入し、テーブルを作成します。

24.あなたは、ストアドプロシージャ、最初のtruncateテーブルの終了時に削除すべての一時テーブルを明示的に確認するために一時テーブルを使用する場合は、システムテーブルに長い時間をロックを避けるために、テーブルをドロップします。

25.カーソルの効率が悪いが、カーソル操作10,000以上のラインならば、あなたは書き換え考慮しなければならないので、カーソルを使用しないようにしてください。

26.あなたが問題を解決するためにセットベースのソリューションを探す必要があり、一時テーブルに基づくメソッドまたはメソッドの前にカーソルを使用して、通常より効率的なセットベースの方法。

27.一時テーブル、カーソルは使用不可能ではありません。小さなデータセットに使用FAST_FORWARDカーソルは、特にいくつかのテーブルを参照して必要なデータを得るためにある必要があり、通常、他の進歩的な治療法よりも優れています。結果セット内の速いカーソルの速度を用いて行う通常のルーチンより「全」を含みます。開発時間が許せば、カーソルベースの方法と優れている方法を参照しようとするベースのアプローチを設定することができます。

すべてのストアド・プロシージャとトリガの開始時NOCOUNT ON SET 28セットは、SET NOCOUNT OFFは、端部に配置されました。DONE_IN_PROCは、各文を実行し、ストアドプロシージャをトリガされた後、クライアントにメッセージを送信する必要はありません。

29.避けてはデータが大きすぎる場合、あなたが対応する需要が合理的である検討すべき、クライアントに大量のデータが返されました。

30.システムの同時実行性を向上させ、大規模なトランザクション操作を避けるようにしてください。

おすすめ

転載: www.cnblogs.com/cuteCoderSnow/p/11314178.html