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

时间:2012-09-24 11:02:23

标签: sql-server sql-server-2008 ssis

我的SSIS包因上述错误而失败。

  

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

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

SET QUERY_GOVERNOR_COST_LIMIT 0 

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

  

来源:“Microsoft SQL Server Native Client 10.0”Hresult:   0x80004005描述:“查询已被取消,因为   此查询的估计成本(336)超过配置的阈值   300.联系系统管理员。“。结束错误

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

2 个答案:

答案 0 :(得分:4)

除非你在包装上设置了“保留相同的连接”属性,这不是我对它的价值的偏好,你所遇到的是documentation所说的。

Using SET QUERY_GOVERNOR_COST_LIMIT applies to the current connection only 
and lasts the duration of the current connection

在包中,为Execute SQL Task打开一个连接,发出查询调控器语句并终止该任务。然后,在数据流任务中使用新的/不同的连接作为OLE DB源(或ADO.NET源)的一部分。这种联系并没有改变州长的成本,因此它受制于QG。

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

的内容
SET QUERY_GOVERNOR_COST_LIMIT 0;
SELECT
    MT.*
FROM
    dbo.MyTable AS MT;

修改

鉴于目标表正在推动QG限制,快速而肮脏的方法是修改Destination的Connection Manager以将RetainSameConnection属性设置为True。这将确保目标转换中的相同连接已经修改了成本。有一个屏幕截图,你在这个问题的答案中设置了这个

SSIS: Default Logging OnError don't work with RetainSameConnection

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

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

答案 1 :(得分:4)

有一种方法可以为整个服务器更改它,在SSMS中使用GUI选项
1.在“服务器属性”对话框中,转到“连接”页面 2.选择“使用查询调控器防止长时间运行查询”选项 3.在该选项下方的框中,键入最大查询成本限制。有效范围是0到2,147,483,647。值为0将禁用查询调控器;任何其他值设置最大查询成本限制 4.单击“确定”。

来源:Technet Article: Use the Query Governor to Control Excessive Query Execution