良いsql習慣を身につける(3)


From:http://database.51cto.com/art/201105/265497_5.htm
七:できるだけ索引を使う
インデックスを作成すると、クエリーごとにインデックスが使用されるわけではありません.インデックスを使用する場合、インデックスの使用効率にも大きな違いがあります.クエリ文にインデックスを強制的に指定しない限り、
インデックスの選択と使用方法はSQLSERVERのオプティマイザが自動的に選択し、クエリ文の条件と関連テーブルの統計に基づいて選択されます.これはSQLを書く必要があります.
文の場合は、オプティマイザがインデックスを使用できるようにします.オプティマイザがインデックスを効率的に使用できるように、文を書くときは注意してください.
A、インデックスフィールドを演算するのではなく、変換する方法を考えます.
SELECT ID FROM T WHERE NUM/2=100
次のように変更します.
SELECT ID FROM T WHERE NUM=100*2
-------------------------------------------------------
SELECT ID FROM T WHERE NUM/2=NUM1
NUMにインデックスがある場合は、次のように変更します.
SELECT ID FROM T WHERE NUM=NUM1*2
NUM 1にインデックスがある場合は変更すべきではありません.
--------------------------------------------------------------------
次のような文が見つかりました.
SELECT年、月、金額FROM残高表WHERE 100*年+月=2010*100+10
以下に変更する必要があります.
SELECT年、月、金額FROM残高表WHERE年=2010 AND月=10
B、索引フィールドをフォーマット変換しない
日付フィールドの例:
WHERE CONVERT(VARCHAR(10)、日付フィールド、120)='2010-07-15'
に改めるべきだ
WHERE日付フィールド〉='2010-07-15'AND日付フィールド
ISNULL変換の例:
WHERE ISNULL(')<>':WHEREフィールド<>'に変更
WHERE ISNULL(フィールド、')=''変更不可
WHERE ISNULL('F')='T'は、WHEREフィールド='Tに変更する必要があります.
WHERE ISNULL(フィールド、'F')<>'T'は変更しない
C、インデックスフィールドに関数を使用しない
WHERE LEFT(NAME,3)='ABC'またはWHERE SUBSTRING(NAME,1,3)='ABC'
WHERE NAME LIKE'ABC%'に変更してください.
日付クエリの例:
WHERE DATEDIFF(DAY,日付,'2010-06-30')=0
変更する必要があります:WHERE日付>='2010-06-30'AND日付
WHERE DATEDIFF(DAY,日付,'2010-06-30')>0
変更すべき:WHERE日付
WHERE DATEDIFF(DAY,日付,'2010-06-30')>=0
変更すべき:WHERE日付
WHERE DATEDIFF(DAY,日付,'2010-06-30')<0
変更する必要があります:WHERE日付>='2010-07-01'
WHERE DATEDIFF(DAY,日付,'2010-06-30')<=0
変更する必要があります:WHERE日付>='2010-06-30'
D、インデックスフィールドをマルチフィールド接続しない
例:
WHERE FAME+ '. '+LNAME='HAIWEI.YANG'
次のように変更します.
WHERE FNAME='HAIWEI' AND LNAME='YANG'
八:マルチテーブル接続の接続条件はインデックスの選択に重要な意味を持つため、接続条件を書くときに特に注意する必要があります.A、マルチテーブル接続の場合、接続条件は全部書かなければならない.B、接続条件はなるべく集約インデックスC、注意ON、WHEREとHAVINGの部分条件の違いONが最初に実行され、WHEREに次いでHAVING最後に、ONはまず条件に合わない記録をフィルタリングしてから統計を行うので、中間演算で処理するデータを減らすことができ、本来なら速度が最も速く、WHEREもHAVINGより早く、データをフィルタリングしてSUMを行い、2つのテーブルを結合するときにONするので、1つのテーブルの場合、WHEREとHAVINGを残して比較した1結合優先順位を考慮:2 INNER JOIN 3 LEFT JOIN(注:RIGHT JOINはLEFT JOINで代用)4 CROSS JOIN他の注意と了解点は、A、INの後の値のリストに、最も頻繁に現れる値を一番前に、最も少なく現れる値を一番後ろに、判断の回数Bを減らし、ユニオンとユニオンALLの違いに注意する.--重複データのUNIOALLを許可する良いC、DISTINCTを使うことに注意して、必要がない時D、TRUNCATE TABLEとDELETEを使ってEを区別しないでください、データベースにアクセスする回数を減らしますまた私達が記憶過程を書くので、比較的に長いならば、最後にマークで表示して、このように可読性がとても良いため、文があまり書けなくても文がきちんとしていて、C#region sql私が好きなのは
    
    
    
    
  1. --startof   
  2.           sql  
  3. --end of 
の正式な机械の上で私达は普通胜手にプログラムをデバッグすることができなくて、しかし多くの时プログラムは私达の本机の上で问题がなくて、しかし正式なシステムに入って问题があって、しかし私达はまた胜手に正式な机械の上で操作することができなくて、それではどうしますか?ロールバックを使用して、ストレージ・プロシージャまたはsql文をデバッグし、並べ替えを間違えることができます.
    
    
    
    
  1. BEGIN TRAN  
  2.    UPDATE a SET  ='' 
  3. ROLLBACK 
ジョブ・ストレージ・プロシージャ私は一般的に次のセクションを追加します.これにより、チェック・エラーはストレージ・プロシージャに置くことができます.エラー・ロールバック・オペレーションを実行する場合、プログラムにトランザクション・ロールバックがある場合、ストレージ・プロシージャはトランザクションを書かないでください.これにより、トランザクション・ロールバック・ネストが実行効率を低下させます.しかし、チェックをストレージ・プロシージャに置くことができます.これにより、このストレージ・プロシージャを解読し、エラーを排除するのに役立ちます.
    
    
    
    
  1. BEGIN TRANSACTION 
  2. --  
  3. --  
  4. IF ( @@ERROR > 0 )  
  5.         BEGIN 
  6.         --  
  7.                 ROLLBACK TRANSACTION 
  8.                 RAISERROR(' ', 16, 3)  
  9.                 RETURN 
  10.         END 
  11. --  
  12. COMMIT TRANSACTION