我的一个应用程序 (B) 使用 tempdb 将复杂查询拆分为批处理。另一个应用程序 (B) 使用复杂的查询而不使用它。
App A 对于大型数据库更有效。
但是要查看您的情况,您可以像这样执行 DMV 脚本:
-- Get top total worker time queries for entire instance (Query 38) (Top Worker Time Queries)
SELECT TOP(50) DB_NAME(t.[dbid]) AS [Database Name], t.[text] AS [Query Text],
qs.total_worker_time AS [Total Worker Time], qs.min_worker_time AS [Min Worker Time],
qs.total_worker_time/qs.execution_count AS [Avg Worker Time],
qs.max_worker_time AS [Max Worker Time], qs.execution_count AS [Execution Count],
qs.total_elapsed_time/qs.execution_count AS [Avg Elapsed Time],
qs.total_logical_reads/qs.execution_count AS [Avg Logical Reads],
qs.total_physical_reads/qs.execution_count AS [Avg Physical Reads],
qp.query_plan AS [Query Plan], qs.creation_time AS [Creation Time]
FROM sys.dm_exec_query_stats AS qs WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t
CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp
ORDER BY qs.total_worker_time DESC OPTION (RECOMPILE);
然后您可以打开查询计划进行重度查询并尝试搜索以下内容:
StatementOptmEarlyAbortReason="TimeOut"
或者
StatementOptmEarlyAbortReason="MemoryLimitExceeded"
这些事实告诉你把复杂的查询拆分成batch+tempdb
PS。它适用于没有索引/表扫描、缺少索引等的良好查询。