此查询的估计成本超过配置的阈值sis

FJT*_*FJT 5 sql-server ssis sql-server-2008

我有一个SSIS包,失败,出现以上错误。

该数据库的查询调控器限制为300

我尝试在数据流任务执行以下语句之前将“ Execute SQL”任务添加到我的包中:

SET QUERY_GOVERNOR_COST_LIMIT 0 
Run Code Online (Sandbox Code Playgroud)

这在包执行期间显示为成功,但是我的数据流任务仍然失败,并且报告限制为300。

源:“ Microsoft SQL Server本机客户端10.0”结果:0x80004005说明:“该查询已被取消,因为此查询的估计成本(336)超过配置的阈值300。请与系统管理员联系。结束错误

如何在数据流任务上覆盖此设置?

bil*_*nkc 6

除非您在包上设置了“保留相同的连接”属性,这不是我对它的价值的偏好,否则您所经历的就是文档所述的内容。

Using SET QUERY_GOVERNOR_COST_LIMIT applies to the current connection only 
and lasts the duration of the current connection
Run Code Online (Sandbox Code Playgroud)

在您的包内,为执行 SQL 任务打开了一个连接,您的查询调控器语句被发出并且该任务终止。然后在数据流任务中使用新的/不同的连接作为 OLE DB 源(或 ADO.NET 源)的一部分。该连接并未修改调速器的成本计算,因此受 QG 约束。

要解决此问题,您需要修改数据流中的源。假设您刚刚选择了所需的表,您需要将单选按钮从表源切换到查询源(名称近似)。作为此查询的来源,您将使用类似

SET QUERY_GOVERNOR_COST_LIMIT 0;
SELECT
    MT.*
FROM
    dbo.MyTable AS MT;
Run Code Online (Sandbox Code Playgroud)

编辑

鉴于目标表正在突破 QG 限制,快速而肮脏的方法是修改目标的连接管理器以将 RetainSameConnection 属性设置为 True。这将确保目标转换中的相同连接已经修改了成本。有一个屏幕截图显示你在我对这个问题的回答中设置的位置

SSIS:默认登录 OnError 不适用于 RetainSameConnection

其他可能有效的方法是修改数据加载以减少查询(插入)成本。

  • 您可以通过减少提交大小和/或批量大小来实现。
  • 如果目标表被大量索引,维护所有索引的成本可能会使您超过查询调控器的阈值,因此在包运行之前和之后删除并重新创建非聚集索引可能会降低插入成本。由于重新创建 NCI 可能会使工作花费更长的时间,因此它也可能会降低成本(成本)
  • 如果您使用的是企业版并且正在使用分区,您可能能够加载到一个空分区并将其交换。我认为在这种情况下情况并非如此,因为如果分区做得不好,可能会使问题变得更糟。


小智 5

通过SSMS中的GUI选项,可以对整个服务器进行更改。

1.在“服务器属性”对话框中,转到“连接”页面。
2.选择选项“使用查询调控器防止长时间运行的查询”。
3.在选项下方的框中,键入最大查询费用限制。有效范围是0到2,147,483,647。值0禁用查询调控器;其他任何值均设置最大查询费用限制。
4.单击确定。

来源:Technet文章:使用查询调控器来控制过多的查询执行