SQL 서버는 높은 CPU 사용률 문제를 해결하는.

친구가 그 데이터베이스에 좀 도와달라고, 운영 체제가 Windows 2008 R2는, 데이터베이스는 SQL 2008 R2 64 비트입니다. 하드웨어 구성이 상대적으로 높은 여전히, 64G 메모리, 16 코어 CPU, 그는 서버가 Kingdee는 K3 소프트웨어를 실행하고 있다고 말했다, 데이터베이스 인스턴스는 여러 데이터베이스가있다.

현상

그는 요즘은 출연뿐만 아니라 높은 CPU 사용률이 될 것입니다 특정 시간 매일 발생했다

메모리 사용량은 30 G 소요, 너무 높지 않다

100 %의 CPU 사용률

 

 

조사 방향

일반 조사는 다음과 같은 스크립트를 사용하여, 일반적으로 세 가지보기의 sys.sysprocesses, dm_exec_sessions, dm_exec_requests를 사용하는

1

4

5

사용 마스터

가다

- 당신은 지정하려면 데이터베이스를 제거 코멘트를했다

SYS FROM SELECT *. sysprocesses의 [SPID]> 50 - 그리고 DB_NAME ([DBID) = "gposdb"

[SYS] FROM SELECT COUNT (*). dm_exec_sessions] SESSION_ID]> 50

현재 데이터베이스 사용자 연결 번호 봐

그런 다음 지표를보고 다음 문을 사용하여이 문은 소비 상위 10 대부분의 CPU 시간의 세션을 선택, 장애물이 있는지, 정상

1

4

5

6

(7)

8

9

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

SELECT TOP 10

[SESSION_ID,

[REQUEST_ID]

[START_TIME] AS가 "시작 시간"

[상태] AS '상태',

[지령 AS "命令"

최종 도착. [텍스트] AS "SQL 语句"

"데이터베이스 이름"AS DB_NAME ([database_id를])

[Blocking_session_id] AS는 "세션의 다른 세션 ID를 차단"

[Wait_type] AS "자원 유형 대기"

[WAIT_TIME] AS "대기 시간"

[Wait_resource] AS "리소스 대기"

AS는 "실제의 수가 판독"[읽어]

[에서 쓰기] AS "는 숫자 물품"

[Logical_reads] AS "는 논리 번호 읽기"

[ROW_COUNT]는 AS가 "결과의 행수를 리턴"

SYS FROM. dm_exec_requests] AS 데르

CROSS이 적용

SYS. dm_exec_sql_text (DER. sql_handle에]) AS 최종 도착

[SESSION_ID]> 50 AND DB_NAME (DER. database_id를) = "gposdb"

ORDER BY [cpu_time] DESC

다음 SQL 문을 실행할 수있는 특정 SQL 문을보고 싶다면, SSMS에서 텍스트 형식으로 결과를 표시하도록 선택할 기억

1

4

5

6

(7)

- 텍스트 형식으로 디스플레이 선택 SSMS 결과

SELECT TOP 10

최종 도착. [텍스트] AS "SQL 语句"

SYS FROM. dm_exec_requests] AS 데르

CROSS이 적용

SYS. dm_exec_sql_text (DER. sql_handle에]) AS 최종 도착 [SESSION_ID]> 50

ORDER BY [cpu_time] DESC

모방 CPU 시간 소비 작업의 일부

 

 

작업자는 CPU 사용률 조사 밖으로 실행할 수 있는지 여부를 확인하기 위해 몇 가지보기 CPU 스케줄러, 및 사용자 수와 작업자 스레드의 최대 수는있다

1

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

352 16 704

(32) 480 960

1

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이있는 경우, 얼마나 많은 세션 작업자 대기 표시됩니다 다음 문을 실행

과 결합하여 [SYS]. 현재 SQLSERVER 리소스에 대한 대기가없는 경우 [Dm_os_wait_stats가]보기, 다음 SQL 문은 어떤 결과를 표시하지 않습니다

1

4

5

6

(7)

8

9

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

(21)

(22)

(23)

(24)

SELECT TOP 10

[SESSION_ID,

[REQUEST_ID]

[START_TIME] AS가 "시작 시간"

[상태] AS '상태',

[지령 AS "命令"

최종 도착. [텍스트] AS "SQL 语句"

"데이터베이스 이름"AS DB_NAME ([database_id를])

[Blocking_session_id] AS는 "세션의 다른 세션 ID를 차단"

"자원 유형 대기"AS 데르. wait_type]

[WAIT_TIME] AS "대기 시간"

[Wait_resource] AS "리소스 대기"

[가지고 윈도우]. [Waiting_tasks_count] AS "현재 진행중인 대기에서 작업의 수"

AS는 "실제의 수가 판독"[읽어]

[에서 쓰기] AS "는 숫자 물품"

[Logical_reads] AS "는 논리 번호 읽기"

[ROW_COUNT]는 AS가 "결과의 행수를 리턴"

SYS FROM. dm_exec_requests] AS 데르

INNER는 [SYS]를 가입. dm_os_wait_stats] AS를 가지고 윈도우

ON DER. wait_type] = [가지고 윈도우]. wait_type]

CROSS이 적용

SYS. dm_exec_sql_text (DER. sql_handle에]) AS 최종 도착

WHERE [SESSION_ID]> 50

ORDER BY [cpu_time] DESC

SSMS SQLSERVER 천천히 제거를 수행하는 결과가 필요하므로, 예를 들어, I는 현재의 데이터의 요구로 인해 매우 큰 테이블 쿼리 SalesOrderDetail_test 테이블 (100)을 실행,

인한 ASYNC_NETWORK_IO 대기

1

4

USE [하여 AdventureWorks]

가다

DBO FROM SELECT *. SalesOrderDetail_test]

GO (100)

문제의 근원

요즘 관찰과 사건의 조사를 통해, 지금, 문제 해결이 테이블에 인덱스를 추가 인덱스를 누락 일부 테이블의 원인을 확인하는 것입니다

1

4

5

6

t_AccessControl에서 *를 선택 - 액세스 제어 목록 액세스 제어

t_GroupAccess에서 *를 선택 - 사용자 그룹 권한 사용자 그룹 권한 테이블을

t_GroupAccessType에서 *를 선택 - 사용자 그룹 권한을 사용자 그룹 권한 클래스 클래스 테이블

t_ObjectAccess에서 *를 선택 - 객체 권한 테이블 개체 권한을

t_ObjectAccessType SELECT * FROM - 개체 사용 권한 테이블 개체 사용 권한 유형의 유형을

객체 유형 객체 유형 테이블 - t_ObjectType SELECT * FROM

높은 CPU 사용 쿼리 문

1

4

5

6

(7)

8

9

(10)

(11)

SELECT TOP 10

total_worker_time / AS execution_count avg_cpu_cost, plan_handle,

execution_count,

(SELECT SUBSTRING (텍스트, statement_start_offset / 2 + 1,

(CASE WHEN statement_end_offset = -1

THEN LEN (CONVERT (NVARCHAR (최대), 텍스트)) * 2

ELSE statement_end_offset

END - statement_start_offset) / 2)

sys.dm_exec_sql_text (sql_handle에))의 AS QUERY_TEXT FROM

가 sys.dm_exec_query_stats FROM

ORDER BY [avg_cpu_cost] DESC

누락 된 인덱스 쿼리

1

4

5

6

(7)

8

9

(10)

(11)

(12)

(13)

(14)

(15)

(16)

(17)

(18)

(19)

(20)

고르다

데이터베이스 이름 = DB_NAME (database_id를)

[인덱스 번호 없음] = 수 (*)

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

, TABLENAME 문을 =

[EqualityUsage = equality_columns

[InequalityUsage = inequality_columns

= included_columns [Cloumns 포함]

sys.dm_db_missing_index_groups g FROM

INNER는 sys.dm_db_missing_index_group_stats의 가입

s.group_handle = g.index_group_handle ON

INNER는 sys.dm_db_missing_index_details d에 가입

d.index_handle = g.index_handle ON

ORDER BY [총 비용] DESC;

 

 

(보기 큰 이미지)

문제를 찾은 후, 새로운 클러스터되지 않은 인덱스

1

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]

가다

t_AccessControl에 인덱스 IX_t_AccessControl_F4 드롭

CPU 사용량이 정상으로 돌아

다운로드에 템플릿과 추적 파일을 추적, SQL2008R2 버전을 사용 files.cnblogs.com/lyhabc/ 템플릿 및 trace.rar 추적

개요

지속적으로 높은 CPU 부하, 메모리 및 IO는 좋아하지만,이 경우, 첫번째 생각은 문제의 인덱스해야하는 경우, 과거 경험, 여러 번,에서, 모든 가능성에 잘못 갈 수 없어.

참고 문서의 시작 부분에 클라이언트 시스템 부하 차트에 게시 있음

게시 60 개 원래 기사 · 원의 찬양 (52) · 전망 (110) 000 +

추천

출처blog.csdn.net/yihuliunian/article/details/104696886