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