SQLのSETオプションから学ぶ

SET ROWCOUNT

 指定の行数が返された後、SQL Server のクエリの処理を停止する。SELECT TOPよりも優先される。

SET NOCOUNT

 SSMSで実行した場合、通常カウント数が反映されますがONすることでカウントされなくなります。ネットワーク通信量が減るため、パフォーマンスが改善される可能性があります。

SET ARITHABORT

  OFF に設定すると、クエリ最適化に悪影響を与え、パフォーマンスに関する問題が発生する可能性があります。エラー時にNULLで挿入したい場合に有効ですが、OFFにすることはないでしょう。

NSERT、UPDATE、または DELETE ステートメントで算術演算エラー、オーバーフロー エラー、0 除算エラー、またはドメイン エラーが検出されると、SQL Server では NULL 値が挿入または更新されます。

https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-arithabort-transact-sql?view=sql-server-ver15

SET NOEXEC

 コンパイルしますが、実行はしません。ステートメントの実行には、コンパイルと実行の 2 つのフェーズがあるという感覚を掴むことができます。デバッグに使えるとのことですが、SSMSで実行時エラーで対応することが多いはずです。

SET PARSEONLY

 ステートメントの解析だけが行われます。エラーチェックであればSSMSで自動的に返してくれるので使う場面は限られるはずです。

SET STATISTICS TIME

 ステートメントの処理時間の統計が表示ができます。シビアな開発で使われることが想定されます。

SET CONCAT_NULL_YIELDS_NULL

 常にONが推奨されています。明示的にOFFにすると以下のようになります。

 ON の場合、… SELECT 'abc' + NULL の結果は NULL になります。
OFF の場合、… SELECT 'abc' + NULL の結果は abc になります。

https://docs.microsoft.com/ja-jp/sql/t-sql/statements/set-concat-null-yields-null-transact-sql?view=sql-server-ver15

SET STATISTICS IO

 ON のときは統計情報が表示されます。

SET XACT_ABORT ON

 ON の場合は、Transact-SQL ステートメントで実行時エラーが発生すると、トランザクション全体が終了し、ロールバックされます。OFFにする状況が想定できませんが、エラーでもロールバックしない処理が思いつきません。

SET TRANSACTION ISOLATION LEVEL

 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED はダーティーリードとして精度が低くてもよい場合によく使用します。ロックが頻繁に起こる場合は見直すとよいでしょう。

SET TRANSACTION ISOLATION LEVEL
    { READ UNCOMMITTED
    | READ COMMITTED
    | REPEATABLE READ
    | SNAPSHOT
    | SERIALIZABLE
    }

SET DEADLOCK_PRIORITY

 SET DEADLOCK_PRIORITY LOWを優先順位を下げたい場合に使っています。本番環境でテスト処理をする場合に指定しています。

SET DEADLOCK_PRIORITY { LOW | NORMAL | HIGH | <numeric-priority> | @deadlock_var | @deadlock_intvar } 

SET LOCK_TIMEOUT

 SELECT文でもロックすることを知った時に必ず指定するようになりました。
0を指定するとロックがかかった時点でエラーが返されます。-1でタイムアウトなし。1000で1000ms待機後にエラーが返ります。

SET QUERY_GOVERNOR_COST_LIMIT

 0 (既定値) を指定すると、クエリ ガバナーが無効になり、すべてのクエリを永続的に実行できるようになります。


 クエリ コストは、CPU 時間、メモリ、ディスク IO などの推定実行要件に基づいて、クエリ オプティマイザーによって決定される抽象的な値です。 それは、特定のハードウェア構成でクエリを完了するために必要とされる予測所要時間を秒単位で表しています。 この抽象的な値は、実行中のインスタンスでクエリを完了するために必要な時間とは異なります。 

このオプションは詳細設定オプションであるため、熟練したデータベース管理者または認定された SQL Server プロフェッショナルだけが変更するようにしてください。

https://docs.microsoft.com/ja-jp/sql/database-engine/configure-windows/configure-the-query-governor-cost-limit-server-configuration-option?view=sql-server-ver15

SQLドキュメント

SET ステートメント (Transact-SQL) - SQL Server
SET ステートメント (Transact-SQL)

 単純なSQL文しか知らなかった時に出会ったSET文を紹介します。SELECT, FROM, WHEREだけがSQL文じゃないのだと表現の幅を広げることができました。もっと奥深い世界を知りたい方はプログラマのためのSQLをおすすめ致します。

プログラマのためのSQL 第4版: すべてを知り尽くしたいあなたに
日米のDBの達人、夢の共演! SQLの第一人者であるジョー・セルコの名著『Joe Celko's SQL for Smarties, Fourth Edition: Advanced SQL Programming』の日本語版です。本書は、...
SQL
AD
味方出版