我们决定在query_abort
所有数据库服务器上测试并可能实施新的扩展事件跟踪,以了解有关超时查询的更多信息。目前,我们使用rpc_completed
带有status=2
过滤器的事件。
我们将使用此Microsoft 视频中详细介绍的SQLCallStackResolver 工具,并使用该工具处理的列。task_callstack_rva
这是我们从一份声明中得到的痕迹之一SELECT
:
00 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
01 YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
00 SqlDK!ThreadScheduler::SwitchWorker
01 SqlDK!SOS_Scheduler::Switch
02 SqlDK!SOS_Scheduler::SuspendNonPreemptive
03 SqlDK!WaitableBase::Wait
04 sqllang!TDSSNIClient::WriteStatus
05 sqllang!WaitOnWriteAsyncToFinish
06 sqllang!write_data
07 sqllang!flush_buffer
08 sqllang!CTds74::SendRowImpl
09 SqlTsEs!CEsExec::GeneralEval4
0a sqllang!CXStmtQuery::ErsqExecuteQuery
0b sqllang!CXStmtSelect::XretExecute
0c sqllang!CExecStmtLoopVars::ExecuteXStmtAndSetXretReturn
0d sqllang!CMsqlExecContext::ExecuteStmts<1,0>
0e sqllang!CMsqlExecContext::FExecute
0f sqllang!CSQLSource::Execute
10 sqllang!process_request
11 sqllang!process_commands_internal
12 sqllang!process_messages
13 SqlDK!SOS_Task::Param::Execute
14 SqlDK!SOS_Scheduler::RunTask
15 SqlDK!SOS_Scheduler::ProcessTasks
16 SqlDK!Worker::EntryPoint
17 SqlDK!ThreadScheduler::RunWorker
18 SqlDK!SystemThreadDispatcher::ProcessWorker
19 SqlDK!SchedulerManager::ThreadEntryPoint
<frame id="28" address="0x776D11E7" />
1d WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
1e ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
据我所知,查询正在处理并进入多个状态和等待,例如分配给调度程序。但是这些信息如何帮助我们了解导致超时的原因呢?事实上,在我看来,一切都很顺利。