Eu uso .NET para executar operações SQL no SQL Server 2014, aqui está o código usado:
using(SqlConnection conn = new SqlConnection(connectionString)){
//https://stackoverflow.com/questions/1880471/capture-stored-procedure-print-output-in-net
conn.InfoMessage += new SqlInfoMessageEventHandler(logSqlMessages);
conn.Open();
using(SqlCommand stmt = new SqlCommand{
Connection = conn,
CommandText = sql,
CommandTimeout = 30000 // The time in seconds to wait for the command to execute. The default is 30 seconds.
//,CommandType = CommandType.StoredProcedure
})
{
affectedRecords = stmt.ExecuteNonQuery();
} // using stmt
} // using conn
Quando olho para o Active Monitor, há dezenas de linhas referenciando a mesma operação. Todos eles têm o mesmo session_id
, alguns deles têm o Task State em execução e a maioria deles está suspenso. Alguns deles têm LastWaitTime CXPACKET
e a maioria é PAGEIOLATCH_SH
.
Também executei uma consulta no SQL Server e o mesmo comportamento aconteceu no Active Monitor.
Talvez seja um comportamento normal, mas é estranho que uma operação SELECT crie várias linhas e se bloqueie assim. Alguma ideia do que pode estar causando isso?
Várias linhas no monitor de atividade para o mesmo SPID significam que sua consulta foi escolhida para ser executada em paralelo em vários threads.
Cada linha no Monitor de Atividade representa um
ECID
, não umSPID
.O monitor de atividade expõe apenas a
SPID
coluna (session_id
), mas há uma coluna adicional exposta em sys.sysprocesses chamadaECID
( E xecution C ontext ID ) - este é um identificador exclusivo para cada thread que a consulta está utilizando.A
sysprocesses
exibição do sistema está obsoleta, mas você pode encontrar o ECID por outro nome (exec_context_id
) nasys.dm_os_tasks
exibição (assim como em outras exibições relacionadas a tarefas).Aqui está um exemplo de consulta que captura todos os IDs de contexto de execução associados a consultas em execução em uma determinada sessão e o que eles estão aguardando, se houver:
No SQL 2016, duas novas colunas foram adicionadas a sys.dm_exec_requests -
DOP
eparallel_worker_count
- elas podem ser usadas para verificar se a solicitação está sendo executada em paralelo ou não.Outro item importante a ser observado é que a
CXPACKET
espera é inerentemente uma espera de paralelismo - isso por si só nos diz que a consulta está usando mais de um thread.A
PAGEIOLATCH_SH
é uma espera indicando que esses threads estão lendo dados do disco para a memória.