Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
SQL Server 2025 最適化されたロック
Search
Oda Shinsuke
September 26, 2026
Technology
140
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
SQL Server 2025 最適化されたロック
第16回 関西DB勉強会
https://kansaidbstudy.connpass.com/event/398751/
Oda Shinsuke
September 26, 2026
More Decks by Oda Shinsuke
See All by Oda Shinsuke
SQL Server 2025 LT
odashinsuke
0
1k
SQL Server ベクトル検索
odashinsuke
0
2.3k
型を合わせとくとデータが多くなっても安心
odashinsuke
0
410
Other Decks in Technology
See All in Technology
自主式軟體工廠
philipz
0
190
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
3.1k
【データ横丁主催】AI Agentがコンテキストを使って仕事をした後、何が残るのか― 組織の経験を次の判断に引き継ぐ「Agent Memory」
shisyu_gaku
2
320
OpenSharing について熱く語る〜AI アセットの共有について〜
kameitomohiro
0
210
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
270
Lambda MicroVMsが分からなすぎたので使い所を1から考えてみた
tsukuboshi
2
350
SREでアラート疲れを 解決しよう!
kairim0
1
150
LLM機能を自作して分かるSnowflake Cortex AIの強み
nayuts
0
270
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
310
Google Cloud Next Tokyo 26登壇時のスクリプト
recruitengineers
PRO
0
180
AIに攻撃される前に、AIに攻撃させる
tsuchikazu
0
140
Meet AgentCore Identity Consent Portal
hironobuiga
3
180
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
3
4.3k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
210
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Faster Mobile Websites
deanohume
310
32k
Deep Space Network (abreviated)
tonyrice
0
350
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Cult of Friendly URLs
andyhume
79
7k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
350
The browser strikes back
jonoalderson
0
1.8k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
710
Transcript
SQL Server 2025 最適化されたロック 第16回 関西DB勉強会 2026/09/26 @shinsukeoda
アジェンダ 従来のロックの課題 何が最適化されたのか (TID ロック / LAQ) デモ (ローカル SQL
Server 2025) まとめ & ベストプラクティス
何が最適化された? 「最適化されたロック」っていうけど、 何が最適化された? 答え: 大量更新でもロックが激減する ブロッキングが減る ロックエスカレーションが起きにくくなる 仕組みを順に見ていきます
ロックの基本 — SQL Server はこう動く ロック = トランザクションの ACID を守る
仕組み 書き込み = X (排他) ロック、読み取り = S (共有) ロック → X と S は両立しない SQL Server の既定 (READ COMMITTED) は「ロックベース」 更新中の行は読み取りもブロックされる PostgreSQL / Oracle / MySQL (InnoDB) の MVCC (Multi-Version Concurrency Control) とはここが違う U (更新: Update) = 更新候補を調べるとき に取る SQL Server 特有のロック
課題① ロックメモリ 1,000 行 UPDATE = 1,000 個の X 行
ロックをトランザクション終了まで保持 大量更新ではロックメモリが膨らむ テーブル (1,000 行を UPDATE) X X X X X X X X X X X X X X X X X X X X X X X X X X X … X 行ロック ×1,000 (コミットまで保持) ロック 1 個ごとにメモリを消費 ロックメモリが膨らむ
課題② ロックエスカレーション 行ロックが増える (目安 5,000 個超) と テーブルロックに昇格 ロックをメモリで管理する SQL
Server 固有の節約機構、だが… 行ロック ×5,000 超 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X 昇格 テーブルロック ×1 → 無関係な行までブロック / 同時実行性が 低下
課題③ U ロックによるブロッキング スキャン中、条件判定のために各行へ U ロックを取得 条件に合わない行を通過するだけでもブ ロックされる ※適切なインデックスがあればこの例は回 避可能
— ただし万能ではない セッション2: UPDATE … WHERE a=2 (スキャン) 行1 の U ロック取得で停止 → ブロック! 行1 X 保持中 (セッション1) 行2 (a=2) 行3 行4
最適化されたロックとは SQL Server 2025 (17.x) で追加された新機 能 Azure SQL Database
/ Managed Instance / Fabric では既定で有効 (常に有効) オンプレミスはデータベース単位で設定 2 つのコンポーネント TID (Transaction ID: トランザクション ID) ロック LAQ (Lock After Qualification: 修飾後ロック)
コンポーネント① TID ロック 各行は最後に変更したトランザクション の TID を持つ 行・ページロックは更新した瞬間に解放 → 保持は
XACT への X ロック 1 個だけ 従来 X 最適化されたロック X X X X X X 行・ページロックは更新した瞬間に解放 X X X X X X X X X X X X X X XACT に X ロック ×1 保持: X 行ロック ×1,000 保持はこの 1 個だけ
コンポーネント② LAQ (修飾後ロック) U ロックを取らず、最新コミット済みバー ジョンで述語を評価 条件を満たした行だけ X ロックを取得 前提:
RCSI (Read Committed Snapshot Isolation) セッション2: UPDATE … WHERE a=2 (スキャン) ブロックされない! 行1 は素通り (コミット済みバージョンで判定) 行1 X 保持中 (セッション1) 行2 (a=2) X 取得して更新 行3 行4
LAQ の注意点 述語評価後に行が変わっていたら、再評 価してから更新 → 整合性は保たれる ただし、トランザクションの厳密な実行 順序に依存する処理では結果が変わり得 る 厳密な順序が必要なら
REPEATABLE READ / SERIALIZABLE を検討
有効化と前提条件 ALTER DATABASE [DB名] SET OPTIMIZED_LOCKING = ON; 前提が揃っているかは sys.databases
で 確認 (デモで見せます) OPTIMIZED_LOCKING = ON RCSI (LAQ に必須) ADR (高速データベース復旧) — 必須 ↑ 土台から順に有効化する
デモ① ロック数の比較 1,000 行 UPDATE を OFF / ON で実行
sys.dm_tran_locks で保持ロックを観察 OFF: KEY の X ロック 1,000 個 + PAGE の IX ロック ON: XACT への X ロック 1 個だけ
デモ② ブロッキングの解消 (LAQ) 2 セッションで「別々の行」を UPDATE (ヒープ = テーブルスキャン) OFF:
セッション 2 がブロックされる ON: ブロックされない! 同じ行なら ON でも正しく待つ (ACID は 守られる)
おまけ: 新しい診断情報 新しい待機の種類: LCK_M_S_XACT_MODIFY / LCK_M_S_XACT_READ sys.dm_exec_requests の wait_resource に
XACT sys.dm_tran_locks に XACT ロックリ ソース デッドロックグラフにも <xactlock> 要 素が追加
まとめ & ベストプラクティス 最適化されたのは「ロックの保持数・保 持期間・取得タイミング」 RCSI を有効にして使うのがベスト ロックヒント (UPDLOCK /
XLOCK / HOLDLOCK …) は必要最小限に クエリの書き換えは不要 (DML の行・ ページロックにのみ影響) 参考: Microsoft Learn「最適化された ロック」