壊れたポイントの記事 - SQLの最適化

メインコンテンツにスキップ

 

 

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

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

3.フィールドはヌル値に避けるべきであるwhere句で決定される、など、エンジンがインデックスとフルテーブルスキャンを使用して放棄します: 
NUM TがNULLである場所からSELECT ID 
を保証するために、0 NUMのデフォルト値を提供することができますNUM表の列の値がnullでない場合、このクエリ: 
= 0 TからSELECT ID NUM 

:4は、接続または状態が、エンジンがインデックスとフルテーブルスキャンを使用して放棄する原因となる、などの句ここでは避けるべきである 
NUM = NUM = 10 TからSELECT ID、または20である 
:この照会可能性 
からSELECT IDがNUM = 10 T WHEREを 
連合のすべての 
SELECTは、IDから= 20はT WHERE NUMです 

次のクエリは、全表スキャンになります: 
SELECT ID「%% ABC」のような名前がTからの 
効率を向上させるために、フルテキスト検索とみなすことができます。 

:6.inは、それ以外の場合のような、フルテーブルスキャンにつながる、注意しなくて使用する必要があり 
、T(2、3)WHEREから前記ID上でSELECT NUM 
:連続的な値については、間に使用することができない 
上記ID上方SELECT TからここでNUM 1〜3 

7. where句のパラメータ場合は、全表スキャンにつながります。SQLので、実行時にのみ、ローカル変数を解決しますが、オプティマイザがアクセス・プランの選択は、実行することができません延期、それはコンパイル時に選択する必要があります。しかし、コンパイル時にアクセス・プランを確立する場合、変数の値が不明であるため、選択されたインデックスエントリとして使用することはできません。次の文は、フルテーブルスキャンを実行するよう: 
SELECTを= @ T NUM NUMは、上記IDから 
インデックスを使用してクエリを強制的に変更することができる: 
T(索引(インデックス名))から上記IDを持つSELECTここNUM = @ NUM 

8.フィールドはエンジンがインデックスと全表スキャンを使用してあきらめてしまいますwhere句式、で動作するように避けるべきです。例えば: 
T / 2 = 100からNUMがSELECT ID 
:読むべき 
SELECT IDをNUM = 100 * 2 Tから 

9.フィールドには、エンジンがインデックスと全表スキャンを使用してあきらめてしまいますwhere句で機能操作を避けるべきです。例えば: 
サブストリング(名前、1,3)= 'ABC'からT SELECT ID - IDのABC名始め 
ここDATEDIFF(日TからIDを選択し 、CREATEDATE、 '2005-11-30')= 0-- 生成された'2005-11-30' IDが 
読みください: 
名など'ABC%'がTからSELECT ID 
T> = CREATEDATE '2005-11-30'からIDを選択し、CREATEDATE < '2005年12月1日'を 

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

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

12.クエリは、このような空のテーブル構造を作成する必要として、意味がありません。書いてはいけません: 
tは1 = 0から#tをINTO SELECT COL1、COL2 
このコードは、任意の結果セットを返しませんが、消費のシステムリソースは、変更する必要がありますこのような 
表に#tを作成します(...) 

:多くの場合、代わりに使用が存在する13.良い選択である 
(BからSELECT NUM)におけるAからSELECT NUM NUM 
次の文に置き換えた: 
。SELECT NUMは、(SELECT WHERE AからBに存在するから1 WHERE NUM = a.num ) 

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

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

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

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

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

19.未満でフィールドのいずれかを返さない、代わりに「*」のフィールドの特定のリストで、T *から選択した任意の使用を置かないでください。 

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

21.避けては作成頻繁に削除一時テーブルは、システムテーブルは、リソースの消費を削減します。 

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

23.新しい一時テーブルは、一のインサートデータ大量の場合には、増加速度のために、ログの多くを回避するために、テーブルを作成するに選択の代わりに使用することができる場合には、小さなデータであれば、あるべきシステム・リソース・テーブルを容易にするために挿入し、テーブルを作成します。 

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

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

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

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

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

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

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

 

 

 

                

 

メインコンテンツにスキップ

发布了42 篇原创文章 · 获赞 15 · 访问量 2771

おすすめ

転載: blog.csdn.net/qq_38299170/article/details/104133887