データベースを検索するので、クエリの効率を向上させるために

1)データベースの設計: 
        Aのクエリの最適化は、全表スキャンを回避しようとしてください、あなたは最初の場所と順番に関与列でインデックス作成を検討する必要があります。.. 
        。Bフィールドはヌル値に避けるべきであるwhere句で決定される、など、エンジンがインデックスとフルテーブルスキャンを使用して放棄します:numをさTから選択IDヌルを保証するために、0 NUMのデフォルト値に設けてもよいですNUM = Tから選択ID:NUM表の列の値がNULLの場合、このクエリはない 0

        C。すべてのインデックスが有効なクエリは、SQLクエリの最適化は、テーブル内のデータに基づいて行われ、時にインデックスリストの重複データを大量に、クエリはテーブルなど、インデックスを活用するためにではないかもしれない女性、男性、フィールドのセックスを持っていませんほぼ半分それぞれ、性別も効果なしクエリ効率指標に建設された場合でも。

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

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

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

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

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

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

        J.一時テーブルを使用することができないではないデータ・セットへの参照は、大きなテーブル場合やテーブルを用いる反復する場合、それらは好適には、例えば、特定のルーチンをより効果的にするために使用することができます。しかし、1回限りのイベントのために、それは、エクスポートテーブルを使用するのが最適です。

        新しい一時テーブル内のK、データの挿入大量場合、それが使用される代わりの速度を上げるために、ログの多くを回避するために、テーブルを作成するに選択することができ、小さなデータであれば、システム・リソース・テーブルを容易にするために、SHOULD挿入し、テーブルを作成します。

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

 

2)SQL文の側面:

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

        。Bは、接続したり、状態はエンジンのような指数と全表スキャンを使用して、あきらめてしまいますwhere句では避けるべきです。 

NUM = 10またはNUM = 20トンからIDを選択 

クエリが実行できます。

= 10組合numは全てここでNUM = 20 TからIDを選択するTからIDを選択

        。Cにおけるそれ以外の場合のような、フルテーブルスキャンにつながる、注意しなくで使用されるべきです。 

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

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

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

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

名前のように「%ABC%」トンからIDを選択します

        パラメータは、where句で使用した場合すなわち、全表スキャンにつながります。SQLので、実行時にのみ、ローカル変数を解決しますが、オプティマイザがアクセス・プランの選択は、実行することができません延期、それはコンパイル時に選択する必要があります。

     しかし、コンパイル時にアクセス・プランを確立する場合、変数の値が不明であるため、選択されたインデックスエントリとして使用することはできません。次の文のよう全表スキャンを実行します。 

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

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

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

        F。エンジンがインデックスとフルテーブルスキャンを使用してあきらめてしまうwhere句、内のフィールドオペレーションの表現を避けるべきです。以下のような: 

ここでNUM / 2 = 100トンからIDを選択 

お読みください: 

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

        グラム。フィールドはエンジンがインデックスとフルテーブルスキャンを使用してあきらめてしまいますwhere句で操作機能のために避けるべきです。以下のような: 

(名前、1,3)= 'ABC' サブストリングここで、tからIDを選択

-nameはABCのidで始まります

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

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

お読みください: 

名前のような 'ABC%' はCREATEDATE> = '2005-11-30'とCREATEDATE <' 2005年12月1日' TからIDを選択するTからIDを選択

        H。ない関数、算術演算、またはその他の表現、where句「=」左、またはシステムが正常にインデックス付けをすることができないです。

        。私はそのような空のテーブル構造を作成する必要など、いくつかのクエリを、記述しても意味がありません。 

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

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

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

        。Jは、多くの時間が存在する代わりの使用に適しています: 

(Bから選択NUM)で場合NUMからNUM選択 

次の文で置き換えます。 

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

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

        リットル。カーソル操作がより10,000行よりも、あなたが書き換え検討する必要がある場合、カーソルの効率が悪いので、カーソルを使用しないようにしてください。

        メートル。データが大きすぎる場合は、大量のデータを避けるために、クライアントに返さ、それが需要に対応すると考えるべきであるが合理的です。

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

おすすめ

転載: www.cnblogs.com/huangguifeng/p/12005697.html