友人は彼がデータベースを見て助けるために私に尋ねた、オペレーティングシステムは、Windows 2008 R2、データベースはSQL 2008 R2 64ビットです。ハードウェア構成は、まだ64Gメモリ、16コアのCPUが比較的高い場合、彼は複数のデータベースがあるデータベース・インスタンス、サーバは金蝶K3ソフトウェアを実行していると述べました。
現象
彼は、これらの日が唯一の登場と言ったが、また、高いCPU使用率が毎日特定の時間に発生するでしょう
メモリ使用量が高すぎないか、わずか30 Gを取ります
100%のCPU使用率
捜査の方向
一般的な調査は次のスクリプトで、通常3ビューsys.sysprocesses、dm_exec_sessions、dm_exec_requestsを使用しています
1
2
3
4
5
USEマスター
GO
- データベースを指定する場合は削除コメントを取りました
SYS SELECT * FROM [sysprocessesの] [SPID]> 50 --and DB_NAME([DBID])= "gposdb"
[SYS] FROM SELECT COUNT(*)。[dm_exec_sessions] [SESSION_ID]> 50
現在のデータベースユーザー接続の数を見てください
その後の指標を見て、次のステートメントを使用し、この文はかかりトップ10ほとんどのCPU時間のセッションを選択し、障害物があるかどうか、正常です
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT TOP 10
[セッションID]、
[REQUEST_ID]
[START_TIME] "開始時間" AS
[状態] AS "ステータス"、
[コマンド] AS "命令"、
DEST。[テキスト] AS "SQL语句"、
"データベース名" AS DB_NAME([のdatabase_id])
[Blocking_session_id] "セッションIDは、他のセッションをブロックし、" AS
[Wait_type] AS「リソースタイプを待っています」
[WAIT_TIME] AS "待ち時間"
[Wait_resource] AS "リソース待ち"
「物理の読み込み数」として[読み込み]
「番号を書き、」AS [書き込みは]
[Logical_reads]「論理の読み込み数」AS
[ROW_COUNTは] ASは、「結果の行数を返します」
SYS FROM。[dm_exec_requests] AS DER
CROSSが適用されます
SYS。[dm_exec_sql_text(DER [たsql_handle])AS DEST
【SESSION_ID]> 50 AND DB_NAME(DER【のdatabase_id])= "gposdb"
ORDER BY [CPU_TIME] DESC
あなたは、次のSQL文を実行することができ、特定のSQL文を表示したい場合は、SSMSでテキスト形式で結果を表示するように選択することを忘れないでください
1
2
3
4
5
6
7
- テキスト形式で表示中に選択SSMS結果
SELECT TOP 10
"SQL语句" AS DEST。[テキスト]
SYS FROM。[dm_exec_requests] AS DER
CROSSが適用されます
SYS。[dm_exec_sql_text(DER [たsql_handle])DEST [SESSION_ID] AS> 50
ORDER BY [CPU_TIME] DESC
模倣CPUの消費時間の動作の一部
労働者はまた、CPU使用率の調査が不足することが可能かどうかを確認するには、いくつかの視聴CPUスケジューラ、およびユーザ番号とワーカースレッドの最大数がありますが、
1
2
3
4
- CPUスケジューラの数、およびユーザーの数を確認します
SELECT CPU_COUNT、sys.dm_os_sys_info FROM scheduler_count
- ワーカースレッドの最大数を表示
sys.dm_os_sys_info FROM SELECT max_workers_count
ユーザーおよびシステムを含む、マシン上のすべてのスケジューラを見ます
次の文は、必要なスレッドの最大数は、ブロッキングをチェックする際に、作業員がなくなったかどうかを見ることができます
以下の比較表
CPUとSQLSERVERバージョン自動設定のワーカースレッドの最大数は、様々な組み合わせ
32ビットコンピュータCPU 64コンピュータの数
<= 4 256 512
8 288 576
16 352 704
32 480 960
1
2
3
4
5
6
7
8
選択する
scheduler_address、
scheduler_id、
CPU_ID、
状態、
current_tasks_count、
current_workers_count、active_workers_count
sys.dm_os_schedulers FROM
待つリソースSQLSERVERがある場合、どのように多くのセッションワーカー待ちが表示されます、次の文を実行
現在SQLSERVERがリソースのための待ち時間がない場合は、[SYS]。[Dm_os_wait_stats]ビューと組み合わせることで、次のSQL文は何も結果が表示されません
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT TOP 10
[セッションID]、
[REQUEST_ID]
[START_TIME] "開始時間" AS
[状態] AS "ステータス"、
[コマンド] AS "命令"、
DEST。[テキスト] AS "SQL语句"、
"データベース名" AS DB_NAME([のdatabase_id])
[Blocking_session_id] "セッションIDは、他のセッションをブロックし、" AS
"リソースタイプを待っている" AS DER。[wait_type]
[WAIT_TIME] AS "待ち時間"
[Wait_resource] AS "リソース待ち"
[Dows]。[Waiting_tasks_count] AS "は、現在進行中の待機中のタスクの数"
「物理の読み込み数」として[読み込み]
「番号を書き、」AS [書き込みは]
[Logical_reads]「論理の読み込み数」AS
[ROW_COUNTは] ASは、「結果の行数を返します」
SYS FROM。[dm_exec_requests] AS DER
INNERは、[SYS]登録しよう。[dm_os_wait_stats] dows AS
DER ON [wait_type] = [dows]。[wait_type]
CROSSが適用されます
SYS。[dm_exec_sql_text(DER [たsql_handle])AS DEST
【SESSION_ID]> 50
ORDER BY [CPU_TIME] DESC
SSMS SQLSERVERをゆっくり取り外しを行った結果には必要なので、例えば、私は現在、原因のデータの非常に大きなテーブルに、クエリSalesOrderDetail_testテーブル100を実行し、
原因ASYNC_NETWORK_IO待ち
1
2
3
4
USE [AdventureWorksの]
GO
DBO SELECT * FROM [SalesOrderDetail_test]
GO 100
問題の原因
これらの日の観察および例調査を通じ、今、問題解決、これらのテーブルにインデックスを追加して、インデックスが欠落しているいくつかのテーブルの原因を決定することです
1
2
3
4
5
6
t_AccessControlから選択* - アクセス制御リストのアクセス制御
t_GroupAccessから選択* - ユーザーグループの権限のユーザーグループの権限テーブル
t_GroupAccessTypeから*を選択 - ユーザーグループの権限をユーザーグループの権限クラスクラステーブル
t_ObjectAccessから選択* - オブジェクト権限テーブルのオブジェクト権限
t_ObjectAccessTypeから選択* - オブジェクト権限テーブルオブジェクトのアクセス許可の種類のタイプを
t_ObjectTypeから選択* - オブジェクトタイプのオブジェクトタイプテーブル
CPU使用率が高いクエリステートメント
1
2
3
4
5
6
7
8
9
10
11
SELECT TOP 10
avg_cpu_cost、plan_handle、AS total_worker_time / execution_count
execution_count、
(SELECT SUBSTRING(テキスト、statement_start_offset / 2 + 1、
(CASE statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX)、テキスト))* 2
ELSE statement_end_offset
END - statement_start_offset)/ 2)
sys.dm_exec_sql_text(たsql_handle)FROM)QUERY_TEXT AS
sys.dm_exec_query_stats FROM
ORDER BY [avg_cpu_cost] DESC
不足しているインデックスのクエリ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
選択する
データベース名= DB_NAME(のdatabase_id)
、[数値インデックスが欠落] = COUNT(*)
sys.dm_db_missing_index_details FROM
GROUP BY DB_NAME(のdatabase_id)
2 DESC BY ORDER。
SELECT TOP 10
[総コスト] = ROUND(avg_total_user_cost * avg_user_impact *(user_seeks + user_scans)、0)
、avg_user_impact
、テーブル名=ステートメント
[EqualityUsage] = equality_columns
[InequalityUsage] = inequality_columns
[Cloumnsを含め] = included_columns
sys.dm_db_missing_index_groupsグラムFROM
INNERはsys.dm_db_missing_index_group_statsの登録しよう
ON s.group_handle = g.index_group_handle
INNERはsys.dm_db_missing_index_details dを登録しよう
ON d.index_handle = g.index_handle
ORDER BY [総コスト] DESC;
(大きな画像を見ます)
問題を見つけた後、新たな非クラスタ化インデックス
1
2
3
4
5
6
7
非クラスタ化インデックスIX_t_AccessControl_F4 ON dbo.t_AccessControlをCREATE
(
FObjectType
)が挙げられる([FUserID]、[FAccessType]、[FAccessMask])WITH(STATISTICS_NORECOMPUTE = OFF、IGNORE_DUP_KEY = OFF、ALLOW_ROW_LOCKS = ON、ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]
GO
t_AccessControlにインデックスIX_t_AccessControl_F4をドロップ
CPUの使用率が通常の状態に戻っています
ダウンロードするテンプレートと、トレースファイルの追跡、SQL2008R2のバージョンを使用します。files.cnblogs.com/lyhabc/トラッキングテンプレートとtrace.rarを
概要
過去の経験から、何度も、持続的な高CPU負荷、メモリとIOは大丈夫ですが、その後、この場合には、最初に考えたが、問題のインデックスである必要があり、すべての可能性に間違って行くことはできません。場合
資料の冒頭に、クライアント・マシンの負荷チャート上に掲載することを注意