SQL Server para solucionar alta de la CPU.

Un amigo me pidió que le ayudara a mirar a la base de datos, el sistema operativo es Windows 2008 R2, la base de datos es SQL 2008 R2 de 64 bits. Configuración de hardware es todavía relativamente alta, la memoria 64G, la CPU de 16 núcleos, dijo que el servidor se ejecuta software Kingdee K3, las instancias de base de datos hay múltiples bases de datos.

fenómeno

Dijo que en estos días aparecieron solamente, sino que también será alta utilización de la CPU se produce en un momento determinado cada día

uso de la memoria no es demasiado alto, sólo tarda 30 G

100% de utilización de la CPU

 

 

La dirección de la investigación

investigación general están con la siguiente secuencia de comandos, por lo general utiliza tres vistas sys.sysprocesses, dm_exec_sessions, dm_exec_requests

1

2

3

4

5

USE master

VAMOS

- Si desea especificar la base de datos se quitan los comentarios

* SELECT FROM sys. [Sysprocesses] Donde [SPID]> 50 --y DB_NAME ([dbid]) = "gposdb"

SELECT COUNT (*) a partir de [sys]. [Dm_exec_sessions] Donde [session_id]> 50

Mira la base de datos actual número de conexiones de usuario

A continuación, utilice la siguiente instrucción para mirar los indicadores son normales, si existe obstrucción, esta declaración se selecciona sesiones de la 10 más tiempo de CPU que consumen

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

21

SELECT TOP 10

[ID de sesión],

[REQUEST_ID],

[START_TIME] como "hora de inicio"

[Estado] como "Estado",

[Comando] "TAL 命令",

dest. "sql 语句" [Texto] AS,

DB_NAME ([database_id]) como "nombre de base de datos"

[Blocking_session_id] "TAL ID de sesión bloquear otras sesiones"

[Wait_type] como "Esperando tipo de recurso"

[Wait_time] como "tiempo de espera"

[Wait_resource] "TAL espera de recursos"

[Lee] AS "número de lecturas físicas"

[Escrituras] "TAL escribir el número"

[Logical_reads] AS "número de lecturas lógicas"

[Row_count] "TAL Devuelve el número de filas en el resultado"

De sys. [Dm_exec_requests] AS der

CROSS APPLY

sys. [dm_exec_sql_text] (der. [sql_handle]) AS dest

DONDE [session_id]> 50 Y DB_NAME (der. [Database_id]) = "gposdb"

ORDER BY [cpu_time] DESC

Si desea ver una declaración específica de SQL puede ejecutar la siguiente instrucción SQL, recuerde que debe elegir mostrar los resultados en formato de texto en SSMS

1

2

3

4

5

6

7

- Seleccione SSMS resultado en pantalla en formato de texto

SELECT TOP 10

dest. [Texto] "TAL sql 语句"

De sys. [Dm_exec_requests] AS der

CROSS APPLY

sys. [dm_exec_sql_text] (der. [sql_handle]) AS dest DONDE [session_id]> 50

ORDER BY [cpu_time] DESC

Imita algunas de las operaciones de consumo de tiempo de CPU

 

 

Hay varios planificador de visión de la CPU, y el número de usuarios y el número máximo de subprocesos de trabajo, para comprobar si el trabajador también puede quedarse sin investigación utilización de la CPU

1

2

3

4

- Comprobar el número de planificador de la CPU, y el número de usuarios

cpu_count SELECT, scheduler_count DE sys.dm_os_sys_info

- El número máximo de subprocesos de trabajo Ver

max_workers_count SELECT FROM sys.dm_os_sys_info

Ver todos los programadores en la máquina, incluyendo usuario y del sistema

La siguiente declaración se puede ver si el trabajador se acaba, cuando el número máximo de subprocesos necesarios para comprobar el bloqueo

La siguiente tabla comparativa

El número máximo de subprocesos de trabajo varias combinaciones de CPU y la versión SQLSERVER autoconfiguración

Número de 32-bit CPU del ordenador 64 del ordenador

<= 4 256 512

8 288 576

16 352 704

32 480 960

1

2

3

4

5

6

7

8

SELECCIONE

scheduler_address,

scheduler_id,

cpu_id,

estado,

current_tasks_count,

current_workers_count, active_workers_count

DE sys.dm_os_schedulers

Si hay un recurso SQLSERVER que esperar, a continuación, ejecute la siguiente instrucción mostrará el número de sesiones de espera trabajador

En combinación con [sys]. [Dm_os_wait_stats] vista, si el SQLSERVER actual no hay que esperar para un recurso, a continuación, la siguiente instrucción SQL no muestra ningún resultado

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

21

22

23

24

SELECT TOP 10

[ID de sesión],

[REQUEST_ID],

[START_TIME] como "hora de inicio"

[Estado] como "Estado",

[Comando] "TAL 命令",

dest. "sql 语句" [Texto] AS,

DB_NAME ([database_id]) como "nombre de base de datos"

[Blocking_session_id] "TAL ID de sesión bloquear otras sesiones"

der. [wait_type] como "Esperando tipo de recurso"

[Wait_time] como "tiempo de espera"

[Wait_resource] "TAL espera de recursos"

[Dows]. [Waiting_tasks_count] "TAL número de tareas actualmente en curso de espera"

[Lee] AS "número de lecturas físicas"

[Escrituras] "TAL escribir el número"

[Logical_reads] AS "número de lecturas lógicas"

[Row_count] "TAL Devuelve el número de filas en el resultado"

De sys. [Dm_exec_requests] AS der

INNER JOIN [sys]. [] Dm_os_wait_stats dows AS

EN der. [Wait_type] = [dows]. [Wait_type]

CROSS APPLY

sys. [dm_exec_sql_text] (der. [sql_handle]) AS dest

DONDE [session_id]> 50

ORDER BY [cpu_time] DESC

Por ejemplo, actualmente la ejecución de la tabla de consulta SalesOrderDetail_test 100, debido a la gran tabla de datos, por lo que los resultados deben SSMS SQLSERVER realiza retira lentamente,

Causado espera ASYNC_NETWORK_IO

1

2

3

4

Utilice [AdventureWorks]

VAMOS

* SELECT FROM dbo. [SalesOrderDetail_test]

GO 100

Origen del problema

A través de la observación y la investigación del caso en estos días, es determinar la causa de algunas tablas son índices que faltan, ahora añade índices en estas tablas, la resolución de problemas

1

2

3

4

5

6

seleccionar * de t_AccessControl - control de acceso control de lista de acceso

seleccionar * de t_GroupAccess - permisos de grupo de usuarios del usuario de la tabla de permisos de grupo

seleccionar * de t_GroupAccessType - permisos de grupo de usuarios permisos de grupo de usuarios tabla de clase de la clase

seleccionar * de t_ObjectAccess - privilegios de objeto de tabla privilegios de objeto

seleccionar * de t_ObjectAccessType - el tipo de tabla de permisos de objetos de tipo de permiso de objetos

SELECT * FROM t_ObjectType - tabla tipo de objeto tipo de objeto

instrucción de consulta alto uso de CPU

1

2

3

4

5

6

7

8

9

10

11

SELECT TOP 10

total_worker_time / execution_count AS avg_cpu_cost, plan_handle,

execution_count,

(SELECT SUBSTRING (texto, statement_start_offset / 2 + 1,

(CASO CUANDO statement_end_offset = -1

ENTONCES LEN (CONVERT (nvarchar (max), texto)) * 2

statement_end_offset ELSE

END - statement_start_offset) / 2)

DE sys.dm_exec_sql_text (sql_handle)) AS QUERY_TEXT

DE sys.dm_exec_query_stats

ORDER BY [avg_cpu_cost] DESC

consulta al índice que falta

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

SELECCIONE

DatabaseName = DB_NAME (database_id)

[Índices número que falta] = count (*)

DE sys.dm_db_missing_index_details

GRUPO POR DB_NAME (database_id)

ORDER BY 2 DESC;

SELECT TOP 10

[Costo Total] = ROUND (avg_total_user_cost * avg_user_impact * (user_seeks + user_scans), 0)

, avg_user_impact

, NombreTabla = instrucción

, [EqualityUsage] = equality_columns

, [InequalityUsage] = inequality_columns

, [Incluir Cloumns] = included_columns

DE sys.dm_db_missing_index_groups g

INNER JOIN s sys.dm_db_missing_index_group_stats

EN s.group_handle = g.index_group_handle

INNER JOIN sys.dm_db_missing_index_details d

EN d.index_handle = g.index_handle

ORDER BY [Coste Total] DESC;

 

 

(Ver la imagen grande)

Después de localizar el problema, un nuevo índice no agrupado

1

2

3

4

5

6

7

CREAR NONCLUSTERED ÍNDICE DE IX_t_AccessControl_F4 dbo.t_AccessControl

(

FObjectType

) Incluyen ([FUserID], [FAccessType], [FAccessMask]) con (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, allow_page_locks = ON) ON [PRIMARY]

VAMOS

caer IX_t_AccessControl_F4 índice en t_AccessControl

uso de la CPU vuelve a la normalidad

El seguimiento de los archivos de plantilla y traza a descargar, utilizar la versión SQL2008R2: files.cnblogs.com/lyhabc/ plantillas y trace.rar seguimiento

resumen

A partir de la experiencia histórica, muchas veces, si la carga de la CPU sostenida, memoria e IO están bien, pero entonces, en este caso, el primer pensamiento debe ser el índice del problema, con toda probabilidad, no puede ir mal.

Tenga en cuenta que al comienzo del artículo publicado en el gráfico de carga de la máquina cliente

Publicado 60 artículos originales · ganado elogios 52 · vistas 110 000 +

Supongo que te gusta

Origin blog.csdn.net/yihuliunian/article/details/104696886
Recomendado
Clasificación