SQL文を最適化する方法

まず、どこのステートメントのメモ:

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

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

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

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

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

6.エンジンがインデックスとフルテーブルスキャンを使用してあきらめてしまうwhere句、内のフィールドオペレーションの表現を避けるべきです。例えば:
T / 2 = 100からNUMがSELECT ID
:読むべき
SELECT IDをNUM = 100 * 2 Tから

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

8節エンジンがインデックスとフルテーブルスキャンを使用してあきらめてしまいますフィールドに機能動作に避けるべきです。例えば:
サブストリング(名前、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'とCREATEDATE < '2005年12月1日'からIDを選択します

9. where句内の関数、算術演算、またはその他の式を行わないでください「=」左、またはシステムが適切にインデックス付け動作しない場合があります。
---------------------------
他の最適化の考慮事項:

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

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

3.な空のテーブル構造を生成する必要として、意味がないクエリ書き込まないでください:
1 = 0 WHERE tから#tをINTO SELECT COL1、COL2
このコードは、任意の結果セットを返さないのが、システムリソースを消費し、することができます変更:
テーブル#tを(...)を作成します。

DaはJOINマルチテーブルデータ量4.、
最初のタブ次いでJOIN、または読み取りと論理ハイ、パフォーマンスの低下。

5.未満でフィールドのいずれかを返さない、代わりに「*」の分野の特定のリストで、T *からどこかの選択は使用しないでください。

唯一のようにクエリとの接続のパフォーマンスが低下しますし、ストレージのオーバーヘッドが増加します文字、のために設計することがない場合6.数値フィールド、情報を含む数値フィールドを使用しています。
一度だけ文字列内の各文字を比較することにより、クエリとの接続1を処理し、数値の比較のために、エンジンが十分にあるためです。

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

唯一の2つのフィールドを変更する場合8.Update文、そうでない場合は大幅なパフォーマンスのオーバーヘッドを引き起こす頻繁に呼び出される、すべてのフィールドを更新し、ログの多くを持っていません。

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

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

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

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

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

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

15.避け頻繁には、資源の消費を減らすために、システムテーブルを作成し、一時テーブルを削除します。
一時テーブルを使用することはできませんされていない、彼らは、適切には、特定のルーチンをより効果的にするために使用することができる
データセットへの参照は、大きなテーブルを繰り返される場合、またはテーブルが使用される場合、例えば。しかし、1回限りのイベントのために、それは、エクスポートテーブルを使用するのが最適です。

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

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

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

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

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

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

おすすめ

転載: www.cnblogs.com/ryanace1988/p/11083145.html