21
その 裏側 に迫る 小澤 真之 (@Masayuki_Ozawa) SQL Azure

Sql database その裏側に迫る

Embed Size (px)

Citation preview

Page 1: Sql database その裏側に迫る

その 裏側 に迫る

小澤 真之 (@Masayuki_Ozawa)

SQL Azure

SQL Database

Page 2: Sql database その裏側に迫る

本日のお題

この制約の中で CPU 数 / データファイル数等の情報を

取得してみようという誰得情報 をお送りしてみたいと思います。

2

使用できる動的管理ビューが限定されている

リモートデスクトップで接続できない

DBCC コマンドは使用できない

Page 3: Sql database その裏側に迫る

今回取得した情報

3

スケジューラー (CPU) 数

ユーザー DB のデータファイルの数

tempdb のデータファイルの数

Page 4: Sql database その裏側に迫る

スケジューラー (CPU) 数

4※ざっくりいうと CPU コア数 = スケジューラー数

Page 5: Sql database その裏側に迫る

スケジューラー数

• SQL Server 2012 だと…

5

サーバーのプロパティ

sys.dm_os_schedulers

Page 6: Sql database その裏側に迫る

スケジューラー数

• SQL Database ではこれらの情報は取得できない…。

6

ということで、全力で負荷をかけて違うことろから情報を持ってきてみました。

Page 7: Sql database その裏側に迫る

使用したツール

Enzo SQL Baseline

7http://enzosqlbaseline.codeplex.com/

特定の SQL を複数スレッドを使用して同時に実行することができるツール

このツールでぶん回します(500スレッドで同時に INSERT)

Page 8: Sql database その裏側に迫る

スケジューラー数の取得方法

• 負荷をかけている最中に [sys.dm_exec_requests] の[scheduler_id] を取得– 接続単位にどのスケジューラーを使用しているか確認できる

8

2011/06 に取得2012/09 に取得

7~8コアぐらいはあるらしい

Page 9: Sql database その裏側に迫る

ついでに NUMA ノード数

9

• 負荷をかけている最中に [sys.dm_exec_connections] の[node_affinity] を取得– 接続単位にどの NUMA ノードに接続がされているかを確認できる

2012/09 に取得

2 NUMA ノード構成らしいおそらく 2 物理 CPU ソケット

2 CPU : 8 コア環境かも

Page 10: Sql database その裏側に迫る

参考)使用したクエリ

-- スケジューラー数SELECT

scheduler_id, COUNT(*) AS RequestCount

FROMsys.dm_exec_requests

GROUP BYscheduler_id

-- NUMA ノード数SELECT

node_affinity, COUNT(*)

FROM sys.dm_exec_connections

GROUP BY node_affinity

10

Page 11: Sql database その裏側に迫る

データファイル数

11

Page 12: Sql database その裏側に迫る

データファイル数

• SQL Server 2012 だと…

12

データベースのプロパティ

sys.database_files

Page 13: Sql database その裏側に迫る

データファイル数

• SQL Database ではこれらの情報は取得できない…。

13

ということで、全力でぶん回して(以下略)

Page 14: Sql database その裏側に迫る

データファイル数の取得方法

• 大量のロックを取得してロックがかかっているページ番号を[sys.dm_tran_locks] から取得してグルーピング– ファイル ID : ページ ID の形式の情報 が取得できる

14

2012/09 に取得2011/06 に取得

データファイルは 10 ファイルで構成されているらしい※ファイル ID 2 はログファイル

Page 15: Sql database その裏側に迫る

参考)使用したクエリSET NOCOUNT ON

CREATE TABLE [dbo].[Table_1](

[Col1] [uniqueidentifier] NOT NULL,

[Col2] [int] NULL,

[Col3] [char](4500) NULL,

CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED

([Col1] ASC)

)

BEGIN TRAN

DECLARE @i int = 0

WHILE (@i < 100000)

BEGIN

INSERT INTO Table_1 VALUES(NEWID(), @i , NEWID())

SET @i += 1

END

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

DELETE FROM Table_1

SELECT DISTINCT CONVERT(int, LEFT(resource_description,PATINDEX('%:%',resource_description) -1))

FROM sys.dm_tran_locks

WHERE resource_type = 'PAGE'

ORDER BY 1

ROLLBACK TRAN

DROP TABLE [dbo].[Table_1]

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

15

Page 16: Sql database その裏側に迫る

tempdb のデータファイル数

16

Page 17: Sql database その裏側に迫る

tepmdb のデータファイル数

• SQL Server 2012 だと…

17

データベースのプロパティ

sys.database_files

Page 18: Sql database その裏側に迫る

tepmdb のデータファイル数

• SQL Database ではこれらの情報は取得できない…。

18

ということで、全力でぶん回して(以下略)

Page 19: Sql database その裏側に迫る

tepmdb のデータファイル数の取得方法

• 一時テーブルに大量にデータを挿入して、ページに対しての I/O 同期待ちを発生させて、裏でその情報を取得– DB ID : ファイル ID : ページ ID の形式の情報 が取得できる

19

2012/09 に取得 2011/06 に取得

データファイルは 10 ファイルで構成されているらしい

※2:1がないので 11 ファイルの可能性も

Page 20: Sql database その裏側に迫る

参考)使用したクエリ-- 負荷用SET NOCOUNT ON

CREATE TABLE [dbo].[#Table_1]( [Col1] [uniqueidentifier] NOT NULL, [Col2] [int] NULL, [Col3] [char](3000) NULL,

CONSTRAINT [PK_#Table_1] PRIMARY KEY CLUSTERED ([Col1] ASC) )

DECLARE @i int = 0 WHILE (@i < 400000) BEGIN

INSERT INTO #Table_1 VALUES(NEWID(), @i , NEWID()) SET @i += 1

END

ALTER INDEX PK_#Table_1 ON #Table_1 REBUILD UPDATE #Table_1 SET Col1 = NEWID()

DELETE FROM #Table_1

DROP TABLE [dbo].[#Table_1]

-- 情報取得用SET NOCOUNT ON CREATE TABLE #tmp(Col1 nvarchar(100), Col2 nvarchar(100))

WHILE (0=0) BEGIN INSERT INTO #tmpSELECT wait_type, wait_resourceFROM sys.dm_exec_requestsWHERE wait_type IS NOT NULL AND wait_resource <>'' END

SELECT DISTINCT LEFT(COl2,PATINDEX('2:%',Col2)+3)FROM #tmpWHERE LEFT(COl2,PATINDEX('2:%',Col2)) = 2 ORDER BY 1

20

Page 21: Sql database その裏側に迫る

まとめ

SQL Database は以下のような構成になっているかも

21

CPU コア数 7 ~ 8

物理ソケット数 2

データファイル数 10

tempdb ファイル数 10

試行錯誤するとこれ以外にもいろいろな情報が取れますのでこんな情報も取れるというものがありましたらぜひ教えてください♪