SqlServer日常蓄積(三)

4309 ワード

1、TRUNCATEとDELETE
TRUNCATE操作は削除操作ログを記録していません
主な理由は、TRUNCATE操作がトリガをアクティブにしないためです.TRUNCATE操作は各行の削除操作のログを記録しないため、テーブルのデータを削除する必要がある場合は、個人の慣習に基づいて操作するのではなく、削除操作記録ログがあるかどうかを考慮する必要があります.
2、事務
[1]トランザクションのいずれかの文がトランザクション全体をエラーとしてロールバックするわけではありません.他の実行可能な文は成功してコミットされます.
[2]TRY...CATCH
DELETE FROM Table1



BEGIN TRY

    BEGIN TRANSACTION

        INSERT INTO Table1(ID,Age) VALUES(1,20)

        INSERT INTO Table1(ID,Age) VALUES(2,20)

        INSERT INTO Table1(ID,Age) VALUES(3,20)

        INSERT INTO Table3 VALUES(1) 

    COMMIT TRANSACTION

END TRY

BEGIN CATCH

    ROLLBACK TRANSACTION

END CATCH



----            ,          BEGIN CATCH         ,           ,     ,       。

SELECT * FROM Table1



---          XACT_STATE()     0,    DBCC OPENTRAN

SELECT XACT_STATE()



DBCC OPENTRAN



---            

ROLLBACK TRANSACTION


TRY...CATCHでは、オブジェクトエラーやフィールドエラーなどのエラーは返されません.
[3]XACTを開くABORT
SET XACT_ABORT ON

BEGIN TRANSACTION

    INSERT INTO Table1(ID,Age) VALUES(1,20)

    INSERT INTO Table1(ID,Age) VALUES(2,20)

    INSERT INTO Table1(ID,Age) VALUES(3,20)

    INSERT INTO Table3 VALUES(1) 
COMMIT TRANSACTION
SET XACT_ABORT OFF --- ( table3 , , TRY...CATCH ) SELECT * FROM Table1
---         

SELECT XACT_STATE()



DBCC OPENTRAN

         

  SET XACT_ABORT   ON  ,     Transact-SQL          ,           。

  SET XACT_ABORT   OFF  ,           Transact-SQL   ,          。       ,     SET XACT_ABORT   OFF,
。OFF 。 ( ) SET XACT_ABORT 。

3、条件フィールドの順序
インデックスを作成するときはインデックスの順序が重要です.一般的にクエリーが最も頻繁なフィールドを最初のフィールドに設定すると、余分なインデックスを作成することを避けることができます.
だからここで私は一般的にwhere条件をこのように規定して、よくクエリーとして使われるフィールドを最初の位置に置くには、他のフィールドはテーブルの実際のフィールドの順序に従って並べられています.このように、クエリー文がインデックスを取る確率が高くなります.
4、外部接続
[1]外部接続の場合、接続条件はマスターテーブルのデータを変更せず、つまりマスターテーブルのデータを削除しない.
[2]接続条件onでマスターテーブルの条件をどのように設定してもマスターテーブルデータの出力には影響しません.マスターテーブルデータの出力に影響するのはwhere条件のみで、where条件は最後のデータの出力に影響します.付表の条件はwhere条件ではなく接続条件(on)に書くべきで、ここでは外接続(左接続と右接続を含む)を言います.
[3]inner joinにはこのような状況は存在しません.あなたの条件がwhereの後ろに書いてもonの後ろに書いても同じですが、whereの後ろに書くことをお勧めします.
5、述語タイプをフィールドタイプに揃える
[1]述語タイプがフィールドタイプと一致せず、定義テーブルのフィールドタイプがクエリー条件と一致しないため、実行計画がインデックススキャンされ、実行計画selectにもヒントがあります.
[2]述語タイプはフィールドタイプと一致するため、クエリはインデックス検索を実行します.
6、Is Not Nullと!=(または<>)区別
IS NOT NULLと!NULL.データベースに適合する条件があることもよくあります!=NULLのデータですが、空の集合に戻ります.実際には、両者の使用の違いを理解していないためだ.
デフォルトでは、SQLのデフォルトではWhereフィールドに対して!Nullの判断は永遠に0行を返しますが、文法の間違いは提示されません.
理由:SQL ServerドキュメントのNull値の比較演算には、SQL Server 2000などの2つのルールが定義されています.
[1]ANSISQL(SQL-92)で規定されたNull値の比較取値結果はいずれもFalseであり、Null=Null取値でもFalseである.
[2]もう1つはANSISQL規格に準拠していない.すなわち、Null=NullはTrueである.
たとえば、データテーブルtest構造:
ROWNUM DATA ------------------- 1 'Liu Yang'   2 Null   3 '12345'
ANSI SQL規格では、次の2つのクエリはローを返しません.
照会一:SELECT*FROM test WHERE data=NULL
クエリ2:SELECT*FROM test WHERE data<>NULL
ANSI SQL以外の基準では、クエリー1は2行目、クエリー2は1、3行目を返します.
 
これは、SQLではNULLは、値がなく未知数であることに等しい特有のデータ型であるためです.NULLは、0、空の文字列、スペースとは異なります.
ANSI SQL規格でNull値を取得する行は、SELECT*FROM test WHERE data IS NULL
ANSI SQL規格ではなくdata=NULLはdata IS NULLに等しく、data<>NULLはdata IS NOT NULLに等しい.
もしあなたが必ず使うなら!=nullで条件判断を行うには、このコマンド文:SET ANSI_を付ける必要があります.NULLSがOFFすると、データベースがANSI SQL非標準モードに入り、IS NOT NULLと!=nullは等価です.
ここではモード切替コマンドSET ANSI_を使用していますNULLS[ON/OFF].ON値はANSI SQL厳格規格、OFF値は非標準互換モードを採用しています.またSET ANSI_DEFAULTS[ON/OFF]コマンドは標準の切り替えを実現することもできるが、このコマンドはSQL-92標準に適合する設定のセットを制御し、Null値の標準を含む.
デフォルトでは、データベースマネージャ(DB-Library)はSET ANSI_NULLSはOFFです.しかし、私たちのほとんどのアプリケーションは、ODBCまたはOLEDBを通じてデータベースにアクセスしています.オープン互換性のあるデータベース・アクセスプログラムとして、互換性の考慮かもしれません.SETANSI_NULLS値がONに設定されています.このようにしてもたらすいくつかの問題は注意しなければならない.ストアド・プロシージャやカスタム関数のようなアプリケーションはDB-Libraryベースで、デフォルトではSETANSI_NULLSはOFFであり、このようなプログラムではSETANSI_は使用できないNULLSは、1つの環境でルールを変更し、データベース構成パラメータのみを変更できます.
たとえば、あなたのアプリケーションはADODBを使用してデータベースにアクセスし、OleDbまたはODBCデータプロバイダを使用します.クエリー1:SELECT*FROM test WHERE data=NULLクエリー結果セットを取得するコマンドを直接送信したり、ストレージ・プロシージャに保存したりすることができます.しかし、両者のクエリの結果は異なります.クエリーコマンドを直接使用すると、ローは返されません.ストレージ・プロシージャにアクセスすると、2行目のデータが返されます.
最後に、データベースのデフォルトでは、SQL条件クエリーの比較にキーワード「is null」と「is not null」を使用します.