多くの選択クエリを取得するいくつかの静的テーブルがあります
これを各クエリに追加するかどうか、それによってパフォーマンスに違いはありますか?
SQLサーバー2014
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
ここで、以下のクエリを実行した後の待機時間
select *
from sys.dm_os_wait_stats
WHERE [wait_type] NOT IN (
N'CLR_SEMAPHORE', N'LAZYWRITER_SLEEP',
N'RESOURCE_QUEUE', N'SQLTRACE_BUFFER_FLUSH',
N'SLEEP_TASK', N'SLEEP_SYSTEMTASK',
N'WAITFOR', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
N'CHECKPOINT_QUEUE', N'REQUEST_FOR_DEADLOCK_SEARCH',
N'XE_TIMER_EVENT', N'XE_DISPATCHER_JOIN',
N'LOGMGR_QUEUE', N'FT_IFTS_SCHEDULER_IDLE_WAIT',
N'BROKER_TASK_STOP', N'CLR_MANUAL_EVENT',
N'CLR_AUTO_EVENT', N'DISPATCHER_QUEUE_SEMAPHORE',
N'TRACEWRITE', N'XE_DISPATCHER_WAIT',
N'BROKER_TO_FLUSH', N'BROKER_EVENTHANDLER',
N'FT_IFTSHC_MUTEX', N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
N'DIRTY_PAGE_POLL', N'SP_SERVER_DIAGNOSTICS_SLEEP')
order by wait_time_ms desc;
データが不変の場合、データベースを読み取り専用としてマークします。クエリ実行エンジンはこれを認識し、ロックをスキップします。ただし、メリットはわずかです。ロックが懸念される場合は、a)データが不変ではないことを意味するロックの競合があるか、b)取得するロックが多すぎて、必要に応じてインデックスを追加することで対処する必要がある大規模なスキャンを意味します。
詳細については、 SQL Serverのパフォーマンスを分析する方法 を参照してください。
READ UNCOMMITTED
はNOLOCK
を使用するのと同じであり、データが変化しない場合、NOLOCK
と同じパフォーマンス上の利点を提供します。
ただし、これは[〜#〜] not [〜#〜]すべてに対して高速なボタンです。コミットされていないデータはコミットされていないデータであり、基礎となるデータが頻繁に変更される場合は信頼すべきではありません。適切なコンテキストで使用してください。
また、カバーインデックス、つまりクエリを満たすインデックスを検討します。フィルター処理されたインデックスを使用して、喜びを見つけることもできます。 NOLOCK
/READ UNCOMMITTED
。