本文可帮助你排查与查询性能缓慢相关的问题。 它还提供了各种原因和解决方法。
SQL Server 集成服务 (SSIS) 或提取、转换和加载 (ETL) 作业时可能会遇到性能问题。 作业可能会因为复杂的联接和巨大的数据操作语言 (DML) 查询而失败,并且可能需要很长时间才能完成。 这些性能问题是正常的。
在开始排查此类问题之前,请考虑以下问题:
是否检查 Batch、ETL 或批量数据处理作业中的哪个 SQL 语句速度缓慢?
是否启用了性能监视工具(如 Microsoft)或第三方工具来监视 SQL Batch、ETL 或批量数据处理作业中的会话状态?
问题何时发生? 在此之前,数据量或 Batch、ETL 或批量数据处理 T-SQL 语句是否有任何更改?
是否有SQL Server或 OS 修补程序或升级? 服务器硬件是否有更改或迁移?
原因和解决方法
以下部分介绍了 SSIS 或 ETL 作业速度缓慢的典型原因、解决方案和故障排除步骤。
SSIS 作业可能包含许多数据流任务,它可能会尝试从 FTP 服务器下载源文件,然后将数据插入 SQL。 执行以下步骤,检查 SSIS 作业是否在SQL Server上被阻止。
sys.sysprocesses
使用 和
sys.dm_exec_sql_text
函数检查是否存在与 SSIS 相关的活动查询。 如果存在活动查询,则程序名称必须类似于以下屏幕截图:
使用不同版本的 SSIS 或不同方法运行包时,程序名称可能有所不同。 如果无法按程序名称进行筛选,请使用查询文本进行搜索。 例如:
SELECT text,* FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE session_id>50 and text like '%Employees%’
如果在步骤 1 中找不到查询,请使用进程监视器工具确定文件层上是否阻止了任何操作,因为 SSIS 包可以从平面文件加载数据。 如果进程为 SSIS,则可以使用 DTExec.exe 来筛选进程名称。
请联系 SSIS 工程师启用 SSIS 包日志记录,以确定需要很长时间并导致重大延迟的步骤。
无法完成复杂查询
如果完成查询,请收集实际执行计划,并将其视为正常的慢速查询优化。 如果无法完成查询,请使用以下步骤查找正在运行的查询 (2016 SP1 及更高版本) 的实际执行计划:
为其运行以下 语句SET STATISTICS XML
ON
,如以下代码片段所示。 让查询运行更长的时间。
SET STATISTICS XML ON
--your query body
SET STATISTICS XML OFF
运行以下 语句以收集轻型查询计划:将 spid
(服务器进程 ID) 替换为正在执行的查询窗口的 spid
:
SELECT * FROM sys.dm_exec_query_statistics_xml(spid)
SELECT text, * FROM sys.dm_exec_query_statistics_xml(spid)
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
query_plan
单击 ,你将能够在外部测试版查询的执行计划图中提供计划。
在查询计划中查找主要资源使用者。 如果你有历史查询计划(例如 SQL 的 查询存储 功能),请比较并检查计划更改的原因。
插入操作是降低查询性能的原因之一。 以下原因可能导致插入操作变慢:
插入大型批处理会导致日志刷新,这会增加等待期。
每次插入都针对聚集索引主键 (定义为标识列) ,这会导致热点。 症状是 PAGELATCH
争用 (特定于从多个连接插入) 。
对堆的插入速度较慢。
I/O 子系统可能很慢。
下面是一些常见的故障排除提示:
如果基础表中的索引过多,请考虑禁用或删除索引,如SQL Server中的慢插入中所述。
若要将 INSERT
语句与 一起使用 SELECT
,请检查选择操作的性能是否良好。
以下原因可能是删除操作降低查询性能的原因:
删除操作被阻止。
I/O 子系统可能很慢。
下面是解决此方案的一些故障排除提示:
检查是否存在 DELETE CASCADE
语句。 如果是,请检查删除执行计划,或者可以考虑禁用 DELETE CASCADE
表的操作。 有关级联选项,请参阅 ALTER TABLE table_constraint (Transact-SQL) 。
在 语句中DELETE
优化 的性能SELECT
。 例如,可以在以下查询中将删除操作重写为 SELECT
语句,并修改 select 查询性能。
DELETE P
FROM Product P
LEFT JOIN OrderItem I ON P.Id = I.ProductId
WHERE I.Id IS NULL
如果 ETL 作业变慢,原因可能是以下因素:
数据卷磁盘可能已更改。 例如,卷磁盘的速度或负载可能会有所变化。
SQL 或 OS 的配置可能会发生更改。 例如,设置 MAXDOP
可能已更改。 此外,SQL Server版本或应用程序中可能存在升级。 兼容性级别的升级可能会引入 CE 更改。
硬件组件的性能(例如磁盘 I/O、CPU 或内存)可能已更改。
下面是一些常见的故障排除提示:
通过提供相同的硬件和作业配置,重新创建性能快速的上一方案。 此步骤可帮助 PSSDIAG (或类似实用工具) 收集数据以比较和识别慢速查询。 如果涉及 SSIS 作业,则可以从慢速方案中请求 SSISDB 报告,以比较包持续时间。
识别慢查询后,请参阅无法完成复杂查询、删除语句性能和插入语句性能以排查查询性能问题。
如果瓶颈不在 SQL 服务器上,请参阅 SSIS:在包执行期间捕获 PerfMon 计数器 ,并检查是否可以从 SSIS 改进任何内容。