c13 sql server2012知られざるtips集 by 平山理

26
SQL Server 2012 知られざるTips 日本マイクロソフト プレミアフィールドエンジニアリング シニアプレミアフィールドエンジニア 平山

Upload: insight-technology-inc

Post on 08-Jun-2015

2.139 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: C13 SQL Server2012知られざるTips集 by 平山理

SQL Server 2012 知られざるTips集 日本マイクロソフト プレミアフィールドエンジニアリング シニアプレミアフィールドエンジニア 平山 理

プレゼンター
プレゼンテーションのノート
2-3min
Page 2: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

Agenda

Lock 獲得動作の変更 統計情報自動更新の変更 FORCESEEK 機能拡張 クエリプラン収集機能拡張 ページ割り当て状況の確認方法の改善 Cardinality Estimate Framework

プレゼンター
プレゼンテーションのノート
2-3 min.
Page 3: C13 SQL Server2012知られざるTips集 by 平山理

Lock 獲得動作の変更

3

プレゼンター
プレゼンテーションのノート
7-8 min.
Page 4: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

SQL Server 2012 より前の動作

クライアント A SELECT * FROM T - T はパーティションテーブル - SCH-S ロックが必要

クライアント B ALTER TABLE T2 SWITCH PARTITION 1 TO T PARTITION 1 - パーティションをスイッチするDDLを実行 - SCH-M ロックが必要

クライアント C - SELECT * FROM T WITH (NOLOCK) - SCH-S ロックが必要(Dirty Read であっても)

DDL Starvation

Page 5: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

SQL Server 2012 より前の動作(続き)

SCH-S (スキーマ共有ロック) - DDL によるスキーマ変更防止 - Dirty Read にも必要

SCH-M - スキーマ変更ロック - スキーマ変更時の排他制御

SCH-S とSCH-Mは互換性なし

- 後続の SCH-S が付与され続ける - SCH-M は待機し続ける

ロック

問題点

Page 6: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

SQL Server 2012 の動作

15000 パーティションまで分割可能

DDL Starvation の機会増加

アルゴリズムの変更 - FIFOの採用 - SCH-SはSCH-Mをスキップしない

旧動作への復帰 - トレースフラグ 617 - 再起動不要 改善策

パーティション数

Page 7: C13 SQL Server2012知られざるTips集 by 平山理

統計情報

自動更新のための閾値変更

7

プレゼンター
プレゼンテーションのノート
7-8 min.
Page 8: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

従来の統計情報更新アルゴリズム

テーブル基数 =< 500 500 回の変更で統計情報を更新

テーブル基数 > 500 500 回+テーブル基数20% の変更で統計情報を更新

テーブル基数が大きい場合は統計情報の更新頻度低 例: 1,000,000,000 件のデータが存在するテーブルの場合 1,000,000,000 * 0.2 + 500 = 200,000,500 考慮点

Page 9: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

トレースフラグ 2371 の導入

有効なバージョン: SQL Server 2012 RTM SQL Server 2008 R2 SP1 以降

例: 1,000,000,000 件のデータが存在するテーブルの場合 SQRT(1,000,000,000*1000) = 1,000,000

再起動不要

更新タイミング: SQRT(データ件数*1000)

Page 10: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

sys.dm_db_stats_properties 動的管理ビュー

有効なバージョン: SQL Server 2012 SP1 以降 SQL Server 2008 R2 SP2 以降

サンプル数、更新日時、更新回数などを含む

DBCC SHOW_STATISTICS の代替

統計情報の内容を出力

Page 11: C13 SQL Server2012知られざるTips集 by 平山理

FORCESEEK クエリヒント機能拡張

11

プレゼンター
プレゼンテーションのノート
4 – 5 min
Page 12: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

FORCESEEK クエリヒント

オプティマイザの決定をオーバライド

SEEK 操作のみを使用してデータにアクセス

クラスタ化インデックス、非クラスタ化インデックスに有効 FORCESEEK

Page 13: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

FORCESEEK クエリヒント

SEEK 操作のみ指定可能

select * from t with (forceseek)

select * from t with with (forceseek (ix(c1, c2)) )

SEEK 操作に使用するインデックスと列を指定可能

SQL Server 2012

~SQL Server 2008 R2

Page 14: C13 SQL Server2012知られざるTips集 by 平山理

クエリプラン収集機能拡張

14

プレゼンター
プレゼンテーションのノート
5-6 min. (total 33 min.)
Page 15: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

SQL Server 2008 R2 までは…

SQL Server プロファイラ SQLTrace

自由度低

収集する OR 収集しない

高い 収集できない 環境が多い

クエリプラン 収集方法

収集時の負荷

収集条件

Page 16: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

SQL Server 2012 からは…

拡張イベント

Duration OR CPU Time

収集対象の 絞り込み可能

収集時の 負荷軽減

収集可能な 環境の増加

ツールの追加

収集条件の 柔軟な設定

Page 17: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

サンプルコード

CREATE EVENT SESSION test_session ADD EVENT sqlserver.query_post_execution_showplan( WHERE ([cpu_time]>=(10000000))) ADD TARGET package0.event_file(SET filename=N'C:¥Program Files¥Microsoft SQL Server¥MSSQL11.ENGINE_DEV¥MSSQL¥Log¥test.xel') WITH ( MAX_MEMORY=4096KB, EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS, MAX_DISPATCH_LATENCY=30 SECONDS, MAX_EVENT_SIZE=0 KB, MEMORY_PARTITION_MODE=NONE, TRACK_CAUSALITY=OFF, STARTUP_STATE=OFF ) GO

クエリプラン収集イベント: query_post_execution_showplan

収集条件: CPU使用時間 10 秒以上

Page 18: C13 SQL Server2012知られざるTips集 by 平山理

ページ割り当て状況確認方法の改善

18

プレゼンター
プレゼンテーションのノート
5 min. (38 min.)
Page 19: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

ページ割り当て状況確認

DBCC コマンドのみ DBCC IND DBCC EXTENTINFO データの加工に難あり

動的管理関数: sys.dm_db_database_page_allocations フィルタなどが容易

~SQL Server 2008 R2

SQL Server 2012

Page 20: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

パラメータなど

select * from sys.dm_db_database_page_allocations( DB_ID(‘db1') , OBJECT_ID(‘tb1') , NULL , NULL , 'DETAILED' ) go

sys.dm_db_database_page_allocations ( データベースID, オブジェクトID, インデックスID, パーティションID, 出力オプション) – ‘LIMITED’ / ‘DETAILED’

パラメータ

サンプルコード

Page 21: C13 SQL Server2012知られざるTips集 by 平山理

Cardinality Estimate Framework

21

プレゼンター
プレゼンテーションのノート
8 min.
Page 22: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

クエリ実行に時間がかかる(終わらない)……

カージナリティ 見積もり不正

統計情報不正

インデックス不足

クエリ実行プラン収集: 実行プラン内の不正イテレータの特定

estimated = × actual = ○ 調査方法

不適切な クエリ実行プラン

Page 23: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

Cardinality estimate framework

SET STATISTICS XML ON

SET STATISTICS PROFILE ON クエリが完了時に取得

Cardinality estimate framework(拡張イベント): inaccurate_cardinality_estimate イベント

イテレータの実際の出力件数と、見積もり件数との差が閾値を超えたタイミングでイベント発生

~SQL Server 2008 R2 [Actual]プランの収集

SQL Server 2012

Page 24: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

イベント発生のしきい値

見積もり行数が1行の場合 オプティマイザがイテレータの見積もり行数を1行と見積もったケース。 イテレータの実際の処理数が2行以上になるとイベントが発生。

見積もり行数が2から100,000の場合 見積もり行数の5倍以上の行数をイテレータが処理するとイベントが発生。

見積もり行数が100,000より大きい場合 見積もり行数が、100,000より大きい場合。 イベントが発生するときの閾値は次の式で算出。 100,000 * (5-1.2) + 1.2 *[見積もり行数].

Page 25: C13 SQL Server2012知られざるTips集 by 平山理

©2011 Microsoft Corporation. All Rights Reserved.

注意が必要なポイント

ノイズ

クエリが効率的に実行されていてもイベントが発生することがある (FALSE POSITIVE ケース)

負荷 内部的には statistics profile の収集が有効化される

過剰見積もり不検知

- 過少見積もり パフォーマンスへの影響大 - 過剰見積もり パフォーマンスへの影響小

並列クエリ

ノイズ 発生率高 - 並列クエリの見積もり 見積もり行数を単純に並列数で均等に割った値 - 実際に各スレッドが処理する行数 データの配置状況などによって必ずしも均等に処理されるとは限らない

Page 26: C13 SQL Server2012知られざるTips集 by 平山理

© 2011 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market

conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

© 2011 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market

conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

26