6. SQL Server の共有資源
• トランザクション間で共有する資源
• CPU
o 論理 CPU は、SQLOS 上のスケジューラとして一括管理する
o クエリーのコンパイル
o クエリーの実行
• メモリー
o データキャッシュとプロシージャキャッシュ
o 論理ログファイル領域
o 排他制御管理領域
o ユーザー接続管理領域
o その他 SQL Server システム領域
• ストレージ
o ユーザ DB / tempdb の物理ファイル (データファイルとトランザクションログファイル)を、
Windows OS 上のファイルシを関連付け、一括管理をする
o デバイスタイプと接続方法により発生するボトルネックは異なる
• ネットワーク
o デバイスタイプと接続方法により発生するボトルネックは異なる
• 個々のクエリー実行時に必要な共有資源
• クエリーのタイプと実装方法により大きく異なる
o アドホッククエリー、プリペアードクエリー、ストアドプロシージャ
o コンパイル時の CPU 負荷と、メモリー上の実行プラン格納領域
• クエリー実行時 ( 実行コンテキスト )
o 中間結果セットと最終結果セットのメモリー領域
o 結合、ソート、集計処理時の CPU と tempdb (一時テーブル領域)
o カーソル処理、結果セットの転送処理
• ネットワーク上のラウンドトリップ
9. CPU タイプの選定
• 主流は、x 64 アーキテクチャ
• NUMA アーキテクチャ サポートの有無
• NUMA 対応 CPU
o Intel Xeon E3 / E5 / E7 シリーズ
o AMD Opteron
o CPU ソケット内にローカル メモリ コントローラーと複数の高速インターコネクトを内蔵
• マルチコア化が今後も加速
• Intel Xeon E3 4 Core/ソケット
• Intel Xeon E5 8 Core/ソケット
• Intel Xeon E7 10 Core/ソケット
• AMD Opteron 16 Core/ソケット
• クロック数と、キャッシュサイズも重要
• CPU 占有率の監視より、コア数不足(SQLOS スケジューラと 1: 1) を
監視する
10. 必要なメモリサイズの考え方
• SQL Server 2000 では、最もクリティカルな共有リソースだった
• 現在 x64 64 ビットアドレス方式が主流
• SQL Server 2012 Enterprise は、最大 4TB のメモリ空間を提供
• 必要な物理メモリサイズは?
• NUMA アーキテクチャの場合
o NUMA ノードあたり 32 – 64GB を推奨
• SMP アーキテクチャの場合
o CPU コアあたり、4 - 8 GB をスタートラインに
• OLTP の場合、ユーザー DB 容量の 10% を目安にメモリ見積もりを実施する
• 現在でも、メモリー不足を起因とする、トランザクション後負荷時の、
クエリー処理遅延を数多く見かける
o 表面上はストレージサブシステムのボトルネックとして表面化する
11. メモリー見積もりの詳細
• 必要とメモリーの見積もり方法
• Max Server Memory パラメータに含まれるもの
o データキャッシュ領域
– ユーザデータベースサイズに依存する
o プロシージャキャッシュ領域
– 最大値は、サーバー物理メモリーに依存する
– アプリケーションに依存する
o 論理ログファイル領域
– 実行されるトランザクション処理負荷に依存する
o クエリー実行時の作業領域
o ユーザ接続管理領域
o ロック管理テーブル
o その他システム領域
• Windows Server と SQL Server のメモリー
o 実測値で、約 1GB
• SQL Server の起動時予約メモリー領域
o Memory to Leave 領域
– 既定値 256MB
o Worker Threads Stack 領域
– CPU の論理プロセッサー数により自動決定される
12. 64 ビット SQL Server メモリー空間
12
オペレーティング システム領域
Systemdatastructures
Lock
ProcedureCache
Logcache
UsersConnectioncontext
Buffercache
SQL Server カーネル領域
ワーカースレッドスタック
CLR / 拡張ストアド / その他
仮想メモリー空間 : 4TB
max server memory
16. 取得可能な数値
• 動的管理ビュー、動的管理関数、パフォーマンスカウンターでは、
二種類の数値を取得できる
• 累積値
o データベースファイル別 I/O 統計情報
o ロック、ラッチタイプ別発行回数と待ち時間
– ロック : ACID プロパティ実現のためにトランザクション終了まで保持される排他制御
– ラッチ : 主に SQLOS ストレージエンジンが内部処理の為に、一時的に内部で実施する排他制御
o SQLOS 待ち事象別発生回数と待ち時間累積値
• 現在の値
o CPU占有率
o トランザクション数 / 秒
o ディスク I/O 待ちキュー発生数
o バッチとコンパイル発生 / 秒
o ディスク I/O 負荷
17. クエリー実行時の監視
• テーブル / インデックス スキャンの監視
• 適切なインデックスチューニングの実施
o クエリーの実行プラン分析
• 実行時の共有リソース消費状況監視
• アドホッククエリーの CPU 負荷
• メモリー負荷
o クエリープラン領域
o クエリーの中間結果セット領域
• ブロッキングの監視
• システムの致命的な遅延が発生する
o どのアプリケーションが
o どのリソースを
o 古い統計情報が原因ではないか
o Index 定義列と順序は適切か
• 排他待ちの監視
• アプリケーションアーキテクチャに依存する
o 共有ロックと排他ロックの発生状況
o 適切な分離レベル (Isolation level ) の利用
o トランザクション境界と実行時間
19. プロシージャキャッシュ内容の取得
-- プロシージャキャッシュの内容を取得
SELECT st.text, cp.plan_handle, cp.usecounts, cp.size_in_bytes,
cp.cacheobjtype, cp.objtype
FROM sys.dm_exec_cached_plans cp
CROSS APPLY
sys.dm_exec_sql_text(cp.plan_handle) st
ORDER BY cp.usecounts DESC;
20. キャッシュプランの分析 (1)
text usecounts size_in_bytes cacheobj type objtype
(@I_ID nvarchar(4))SELECT I_ID,I_THUMBNAIL FROM ITEM WHERE (I_ID=(SELECT I_RELATED1 FROM
ITEM WHERE I_ID=@I_ID) OR I_ID=(SELECT I_RELATED2 FROM ITEM WHERE I_ID=@I_ID)OR
I_ID=(SELECT I_RELATED3 FROM ITEM WHERE I_ID=@I_ID)OR I_ID=(SELECT I_RELATED4 FROM ITEM
218,493 155,648Compiled Plan Prepared
(@I_ID nvarchar(4))SELECT
I.I_TITLE,A.A_FNAME,A.A_LNAME,I.I_SUBJECT,I.I_IMAGE,I.I_DESC,I.I_COST,I.I_SRP,I.I_SRP-I.I_COST
DISCOUNT,I.I_BACKING,I.I_PAGE,I.I_PUBLISHER,I.I_PUB_DATE,I.I_AVAIL,I.I_DIMENSIONS,I.I_ISBN FROM
ITEM I with(NOLOCK),AUTHOR A with(NOLOC
46,767 32,768Compiled Plan Prepared
(@I_ID nvarchar(3))SELECT I_ID,I_THUMBNAIL FROM ITEM WHERE (I_ID=(SELECT I_RELATED1 FROM
ITEM WHERE I_ID=@I_ID) OR I_ID=(SELECT I_RELATED2 FROM ITEM WHERE I_ID=@I_ID)OR
I_ID=(SELECT I_RELATED3 FROM ITEM WHERE I_ID=@I_ID)OR I_ID=(SELECT I_RELATED4 FROM ITEM
21,724 40,960Compiled Plan Prepared
(@A_LNAME nvarchar(15))SELECT TOP 50 A_FNAME, A_LNAME, I_ID, I_TITLE FROM ITEM I
with(NOLOCK), AUTHOR A with(NOLOCK) WHERE (I.I_A_ID = A.A_ID) AND (A_LNAME LIKE @A_LNAME)
ORDER BY I.I_TITLE ASC
17,575 49,152Compiled Plan Prepared
(@I_TITLE nvarchar(16))SELECT TOP 50 A_FNAME, A_LNAME, I_ID, I_TITLE FROM ITEM I with(NOLOCK),
AUTHOR A with(NOLOCK) WHERE (I.I_A_ID = A.A_ID) AND (I.I_TITLE LIKE @I_TITLE) ORDER BY I.I_TITLE
ASC
17,497 622,592Compiled Plan Prepared
(@C_ID nvarchar(9))SELECT C_LNAME,C_FNAME FROM CUSTOMER WHERE C_ID=@C_ID 17,234 16,384Compiled Plan Prepared
(@I_ID1 nvarchar(4))SELECT I.I_ID, I.I_COST, I.I_SRP, I.I_TITLE, I.I_BACKING FROM ITEM I, ITEM J WHERE
J.I_ID = @I_ID1 AND J.I_RELATED1 = I.I_ID
8,687 24,576Compiled Plan Prepared
(@C_ID nvarchar(8))SELECT C_LNAME,C_FNAME FROM CUSTOMER WHERE C_ID=@C_ID 6,401 16,384Compiled Plan Prepared
(@I_ID nvarchar(4))SELECT I_ID, I_COST, I_SRP, I_TITLE, I_BACKING FROM ITEM WHERE I_ID = @I_ID 6,278 16,384Compiled Plan Prepared
(@I_ID nvarchar(3))SELECT
I.I_TITLE,A.A_FNAME,A.A_LNAME,I.I_SUBJECT,I.I_IMAGE,I.I_DESC,I.I_COST,I.I_SRP,I.I_SRP-I.I_COST
DISCOUNT,I.I_BACKING,I.I_PAGE,I.I_PUBLISHER,I.I_PUB_DATE,I.I_AVAIL,I.I_DIMENSIONS,I.I_ISBN FROM
ITEM I with(NOLOCK),AUTHOR A with(NOLOC
5,587 32,768Compiled Plan Prepared
(@SYSDATETIME nvarchar(4000),@EXPIRATIONDATETIME nvarchar(4000),@C_ID nvarchar(9))UPDATE
CUSTOMER SET C_LOGIN = @SYSDATETIME, C_EXPIRATION = @EXPIRATIONDATETIME WHERE C_ID =
@C_ID
4,207 24,576Compiled Plan Prepared
(@C_UNAME nvarchar(18))SELECT C.C_ID, C.C_UNAME, C.C_PASSWD, C.C_FNAME, C.C_LNAME,
C.C_ADDR_ID, C.C_PHONE, C.C_EMAIL, C.C_DISCOUNT, C.C_BALANCE, C.C_YTD_PMT, C.C_BIRTHDATE,
C.C_DATA, A.ADDR_STREET1, A.ADDR_STREET2, A.ADDR_CITY, A.ADDR_STATE, A.ADDR_ZIP, A.
4,207 65,536Compiled Plan Prepared
(@SCL_I_ID nvarchar(4),@I_STOCK nvarchar(2))UPDATE ITEM SET I_STOCK = @I_STOCK WHERE I_ID =
@SCL_I_ID
4,000 24,576Compiled Plan Prepared
(@SCL_I_ID nvarchar(4))SELECT I_STOCK FROM ITEM WHERE I_ID = @SCL_I_ID 4,000 16,384Compiled Plan Prepared
SELECT MAX(O_ID) AS MAX_O_ID FROM ORDERS with(NOLOCK) 3,563 16,384Compiled Plan Adhoc
(@1 varchar(8000))SELECT [I_ID],[I_COST] FROM [ITEM] WHERE [I_ID]=@1 3,409 40,960Compiled Plan Prepared
(@I_SUBJECT nvarchar(8))SELECT TOP 50 A_FNAME, A_LNAME, I_ID, I_TITLE FROM ITEM I with(NOLOCK),
AUTHOR A with(NOLOCK) WHERE (I.I_A_ID = A.A_ID) AND I.I_SUBJECT = @I_SUBJECT ORDER BY
I.I_TITLE ASC
2,915 32,768Compiled Plan Prepared
21. キャッシュプランの分析 (2)
text
plan_generati
on_num creation_time
execution_
count
last_elapsed_time
(μs)
min_elapsed_
time (μs)
max_elapsed_time
(μs)
create procedure [dbo].[GetRandomCustID] (@CustomerID varchar(5)=NULL
output) as -- Update by Y.Kumazawa June,08,2011 declare @CustLetter
varchar(4) declare @pos int select @pos = datepart(ms,getdate())%137 select
@pos = @pos * 2 select @pos = @pos + 1 select @CustLetter =
substring('AIALAMANAOARBABBBEBLBMBPBQBSCACBCCCECHCOCPDADCDRDUE
AEBEDERFAFCFEFOFQFRFSFTFUGAGCGOGPGRGSHAHCHIHUHWIRISITJAJFJKJLKAK
DKOLALBLCLDLELFLGLHLILJLOMAMBMCMDMEMONANCNOOAOBOCOLOTPAPBP
CPEPIPRQRQSQVQWRARBRCRDRERIRJSASBSCSDSESISPSQTDTETHTITOTPTSUVUW
VAVCVDVIVJWAWBWCWDWEWHWIWOXAXDYAYDZIZK',@pos,2) select
@CustomerID = CustomerID from Customers WITH(NOLOCK) where CustomerID
like @CustLetter + '%' 1
2013/2/19
10:51 1,303 79 37 5,471
create procedure GetRandomEmpID (@EmployeeID int=0 output) as -- This is
provided "AS IS" with no warranties, and confers no rights. -- Use of included
script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm -- declare @EmpLetter varchar(1)
select @EmpLetter = substring('ABCDFKLMNPRT',datepart(ms,getdate())%12,1)
select @EmployeeID = EmployeeID from Employees where LastName like
@EmpLetter + '%' or FirstName like @EmpLetter + '%' 1
2013/2/19
10:51 497 117 23 5,811
create procedure [dbo].[GetCustInfo] (@CustomerID varchar(5)=NULL) as -- This
is provided "AS IS" with no warranties, and confers no rights. -- Use of included
script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm -- -- Update by Y. Kumazawa
June,20,2011 if @CustomerID is NULL exec GetRandomCustID
@CustomerID=@CustomerID output select CompanyName, ContactName,
Address, City, Region, PostalCode, Country, Phone from dbo.Customers
WITH(NOLOCK) where CustomerID = @CustomerID 1
2013/2/19
10:51 236 14 7 97
create procedure GetRandomProductID (@ProductID int=0 output) as -- This is
provided "AS IS" with no warranties, and confers no rights. -- Use of included
script samples are subject to the terms specified at
http://www.microsoft.com/info/cpyright.htm -- declare @maxProdID int select
@maxProdID=max(ProductID) from Products select @ProductID=cast
(round(@maxProdID*rand(),0) as int) 1
2013/2/19
10:51 232 31 10 106
26. クエリをカバ-するインデックス設計
• クエリーをカバーするインデックス定義例
• CREATE NONCLUSTERED INDEX [DEPARTMENT_NAME] ON
[dbo].[DPARTMENT]
([DEPARTMENT_CODE)
INCLUDE ([DEPARTMENT_NAME])
WITH (DROP_EXISTING = OFF) ON [PRIMARY]
• クエリをカバーするインデックスの利用例
• SELECT DEPARTMENT_CODE, DEPARTMENT_NAME
FROM DEPARTMENT
WHERE DEPARTMENT_CODE < 10
AND
DEPARTMENT_CODE > 101
37. データベースの運用設計
- インデックス再構築と再構成のタイミング -
• 再構築とは
• ALTER INDEX REBULD (DBCC DBREINDEX)
• エクステント、論理ページ両方の格納領域の断片化 (Fragmentation) を解消
• オフライン操作
o SQL Server 2008 以降の Enterprise 版は、オンライン再構築をサポート
– 自分自身の格納領域と、tempdb 領域を利用する
• 再構成とは
• ALTER INDEX REORGANIZE (DBCC INDEX DEFRAG)
• 論理ページの格納領域の断片化を解消
• オンライン操作が可能
• 実施タイミング
• 動的管理ビュー sys. dm_db_index_physical_stats による定期的な監視
o エクステント、論理ページの 10% を超える断片化が発生したときに実施する
o 例) 再構成を週に 1 回、再構築を月に 1 回実施
• sort in tempdb オプションを利用する
• 統計情報も同時に更新される
38. 断片化の解消
“エクステント” = 8 ページ
(ページの管理単位)
① ③② ④
空き領域使用済み領域
インデックス キー値の順番 : ① ② ③ ④ ・・・・
INDEX REBULD の実行
① ② ③ ④ ・ ・ ・
OS の
IO 単位
OS の
IO 単位
現在 : “ページ分割によりデータの断片化が発生している状態”
46. NUMA の特徴
• CPUは他ノードを含む全ての物理メモリをマップ可能
• 同一ノード内にあるメモリをローカルメモリ、他ノードにある
メモリをリモートメモリと呼ぶ
• ローカルメモリに対するアクセスの方が効率が良い
• 効率の良いメモリアクセスを行うには、Server OS と RDBが
NUMAに対応している必要がある
メモリー
コント
ローラ
CPU
CPU
CPU
CPU
メ
モ
リ
インターコネクト
メモリー
コント
ローラ
CPU
CPU
CPU
CPU
メ
モ
リ
47. SQL Server と NUMA
• 起動時に NUMA Node の役割を決定する
• Server name is 'WIN-AE68NA9TPVA'.
• The resource database build version is 10.50.1765.
• Node configuration: node 7: CPU mask: 0x00000000000ffc00:1 Active CPU mask: 0x00000000000ffc00:1.
• Node configuration: node 6: CPU mask: 0x00000000000003ff:1 Active CPU mask: 0x00000000000003ff:1.
• Node configuration: node 5: CPU mask: 0x0ffc000000000000:0 Active CPU mask: 0x0ffc000000000000:0.
• Node configuration: node 4: CPU mask: 0x0003ff0000000000:0 Active CPU mask: 0x0003ff0000000000:0.
• Node configuration: node 3: CPU mask: 0x000000ffc0000000:0 Active CPU mask: 0x000000ffc0000000:0.
• Node configuration: node 2: CPU mask: 0x000000003ff00000:0 Active CPU mask: 0x000000003ff00000:0.
• Node configuration: node 1: CPU mask: 0x00000000000003ff:0 Active CPU mask: 0x00000000000003ff:0.
• Node configuration: node 0: CPU mask: 0x00000000000ffc00:0 Active CPU mask: 0x00000000000ffc00:0.
• Lock partitioning is enabled.
• Using dynamic lock allocation. Initial allocation of 2500 Lock blocks and 5000 Lock Owner blocks per node.
• Using locked pages for buffer pool.
• Large Page Allocated: 32MB
• Large Page Allocated: 32MB
• Large Page Allocated: 32MB
• Large Page Allocated: 32MB
• Large Page Allocated: 32MB
• Large Page Allocated: 32MB
• Large Page Allocated: 32MB
• Large Page Allocated: 32MB
• Large Page Granularity: 2,097,152
• Large Page Extensions enabled.
• Detected 80 CPUs.
• SQL Server is starting at normal priority base (=7).
• Registry startup parameters: <nl/> -d C:¥Program Files¥Microsoft SQL Server¥MSSQL10_50.MSSQLSERVER¥MSSQL¥DATA¥master.mdf<nl/> -e C:¥Program
Files¥Microsoft SQL Server¥MSSQL10_50.MSSQLSERVER¥MSSQL¥Log¥ERRORLOG<nl/> -l C:¥Program Files¥Microsoft SQL
Server¥MSSQL10_50.MSSQLSERVER¥MSSQL¥DATA¥mastlog.ldf
• This instance of SQL Server last reported using a process ID of 24724 at 2011/05/25 15:22:44 (local) 2011/05/25 6:22:44 (UTC).
• Logging SQL Server messages in file 'C:¥Program Files¥Microsoft SQL Server¥MSSQL10_50.MSSQLSERVER¥MSSQL¥Log¥ERRORLOG'.
• Authentication mode is MIXED.
• System Manufacturer: 'HP'<c/> System Model: 'ProLiant DL980 G7'.
• Server process ID is 1760.
• All rights reserved.
• (c) Microsoft Corporation.
• Microsoft SQL Server 2008 R2 (RTM) - 10.50.1765.0 (X64) <nl/> Feb 2 2011 17:33:22 <nl/> Copyright (c) Microsoft Corporation<nl/>
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1
48. SQL Server と NUMA ノード
インターコネクト
Windows
Node No Node 0 Node 1 Node 2 Node 3
SQLOS
Node No
Node 1 Node 0 Node 2 Node 3
OS
グローバル・
リソース
SQLOS
ユーザノード
SQLOS
グローバル・
リソース
システムノード
SQLOS
ユーザノード
SQLOS
ユーザノード
メモリー
コント
ローラ
CPU
CPU
CPU
CPU
メ
モ
リ
CPU
CPU
CPU
CPU
メモリー
コント
ローラ
CPU
CPU
CPU
CPU
メ
モ
リ
CPU
CPU
CPU
CPU
メモリー
コント
ローラ
CPU
CPU
CPU
CPU
メ
モ
リ
CPU
CPU
CPU
CPU
メモリー
コント
ローラ
CPU
CPU
CPU
CPU
メ
モ
リ
CPU
CPU
CPU
CPU
49. 重点的な監視が必要な SQLOS 待ち事象
• sys.dm_os_wait_stats から発見可能な問題点
• ストレージ・サブシステムの I/O 帯域不足
• データベース容量と比較したメモリー不足
• アプリケーションアーキテクチャの問題点
o トランザクションの境界
o ロックの種類と利用状況
o 分離レベル (Isolation level)
o クエリー実行時のメモリー不足 (不適切なクエリー)
• データベース物理設計の問題点
o クラスタ化インデックスと
非クラスタ化インデックスの選択
o 物理ファイルのストレージへの格納 (RAID 選択)
50. メモリ共有リソースの監視
• データ キャッシュ領域
• sys. dm_os_wait_stats
o PAGEIOLATCH_xx
• sys. dm_os_performance_counters
o Buffer Manager Page Life expectancy (単位: 秒 600 以上を推奨)
o Buffer Manager Buffer cache hit ratio (単位: % 限りなく 100% を推奨)
• プロシージャ キャッシュ領域
• sys. dm_os_performance_counters
o Memory Manager Optimizer Memory (KB)
• その他共有領域
• sys. dm_os_performance_counters
o Memory Manager Connection Memory (KB)
o Memory Manager Lock Memory (KB)
• sys. dm_os_wait_stats
o LOGBUFFER
• クエリ実行時の一時領域
• sys. dm_os_performance_counters
o Memory Manager Memory Grants Outstanding
• Sys. dm_os_wait_stats
o RESOURCE_SEMAPHORE
o CMEMTHREAD
51. MAX DOP とは
• max degree of parallelism パラメータ
• サーバーのプロパティ詳細設定
o 並列処理の最大限度
• sp_configure
max degree of parallelism パラメータ
• 既定値は 0
o 各ユーザセッションは、SQL Server が認識している
スケジューラ(論理CPUコア)全てを用いて、並列処理を実行可能
– バッチ処理には適切な設定
» 処理時間短縮化を重視
– OLTP 処理では、トランザクション処理の同時実行性を重視
o SQL Server オプティマイザは、実行プラン作成時に、
並列処理可能なプランを自動認識する
52. 並列処理の最大限度 (MAX DOP) の考慮
• 並列処理の最大限度とは
• ユーザ・コネクションから受け取った T-SQL は、オプティマイザにより、
木構造の複数の実行ステップに、分解される
• 各実行ステップは、一つ以上の CPU (スケジューラ) 上で実行される
• この時の、1 タスクが実行可能な並列処理の多重度を、並列処理の最大限度と
呼ぶ
• 考慮点
• 並列処理は、NUMA の同一ノード上で実行されることが、メモリーアクセス
効率化の観点からも重要である。
o NUMA ローカルメモリーアクセスと、リモートメモリーアクセスを比較すると、数倍の時間
を必要とする
• チューニングポイント
• NUMA の場合
o 並列処理の最大限度 (MAX DOP) を、ソケット内の物理 CPU コア数に制限する