SQL文の最適化の30種類を習得しなければならない[オン]

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

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

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

選択 ID からのトンをどこ numがある ヌル

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

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

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

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

クエリが実行できます。

選択 IDをから T NUM = 10 組合すべての選択 ID から T ここで、 NUM = 20

 

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

選択 IDをからトン場所などの %ABC%

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

 と注意して、それ以外の場合は、次のような全表スキャン、につながるべきではありません。

選択 ID から T ここで NUM 123

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

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

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

選択 ID から T ここで、 NUM = @num

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

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

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

選択 ID から Tはここで NUM / 2 = 100

お読みください:

選択 IDをから T NUM = 100 * 2

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

選択 IDをから T ここでストリング(名前、13)= ' ABC '

--name ABCのIDで始まります

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

- '2005-11-30' idが発生しました

お読みください:

選択 IDをから T 名等' ABC%'が選択 IDをから T CREATEDATE> = ' 2005-11-30 'とCREATEDATE < 2005年12月1日]

10.それ以外の場合、システムは、正しいインデックスを使用しない、where句「=」左の関数、算術演算、またはその他の式を実行しません。

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

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

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

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

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

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

選択 NUMをからどこ NUM 選択 NUM から B)を

次の文で置き換えます。

選択 NUM からどこに存在する(選択 1  から B ここで NUM = a.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.システムの同時実行性を向上させ、大規模なトランザクション操作を避けるようにしてください。

[予約:https://zhuanlan.zhihu.com/p/72071609 ]

おすすめ

転載: www.cnblogs.com/jcdd-4041/p/11529568.html