添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

本文可帮助你排查与查询性能缓慢相关的问题。 它还提供了各种原因和解决方法。

SQL Server 集成服务 (SSIS) 或提取、转换和加载 (ETL) 作业时可能会遇到性能问题。 作业可能会因为复杂的联接和巨大的数据操作语言 (DML) 查询而失败,并且可能需要很长时间才能完成。 这些性能问题是正常的。

在开始排查此类问题之前,请考虑以下问题:

  • 是否检查 Batch、ETL 或批量数据处理作业中的哪个 SQL 语句速度缓慢?
  • 是否启用了性能监视工具(如 Microsoft)或第三方工具来监视 SQL Batch、ETL 或批量数据处理作业中的会话状态?
  • 问题何时发生? 在此之前,数据量或 Batch、ETL 或批量数据处理 T-SQL 语句是否有任何更改?
  • 是否有SQL Server或 OS 修补程序或升级? 服务器硬件是否有更改或迁移?
  • 原因和解决方法

    以下部分介绍了 SSIS 或 ETL 作业速度缓慢的典型原因、解决方案和故障排除步骤。

    SQL Server上未阻止性能问题

    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 XMLON,如以下代码片段所示。 让查询运行更长的时间。

    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 作业性能以前更快,现在较慢

    如果 ETL 作业变慢,原因可能是以下因素:

  • 数据卷磁盘可能已更改。 例如,卷磁盘的速度或负载可能会有所变化。
  • SQL 或 OS 的配置可能会发生更改。 例如,设置 MAXDOP 可能已更改。 此外,SQL Server版本或应用程序中可能存在升级。 兼容性级别的升级可能会引入 CE 更改。
  • 硬件组件的性能(例如磁盘 I/O、CPU 或内存)可能已更改。
  • 下面是一些常见的故障排除提示:

  • 通过提供相同的硬件和作业配置,重新创建性能快速的上一方案。 此步骤可帮助 PSSDIAG (或类似实用工具) 收集数据以比较和识别慢速查询。 如果涉及 SSIS 作业,则可以从慢速方案中请求 SSISDB 报告,以比较包持续时间。
  • 识别慢查询后,请参阅无法完成复杂查询删除语句性能和插入语句性能以排查查询性能问题。
  • 如果瓶颈不在 SQL 服务器上,请参阅 SSIS:在包执行期间捕获 PerfMon 计数器 ,并检查是否可以从 SSIS 改进任何内容。

  •