6

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

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

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

SET QUERY_GOVERNOR_COST_LIMIT 0 

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

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

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

4

2 回答 2

6

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

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

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

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

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

编辑

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

SSIS:默认日志记录 OnError 不适用于 RetainSameConnection

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

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

有一种方法可以为整个服务器更改它,使用 SSMS 中的 GUI 选项。

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

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

于 2016-08-26T13:46:03.543 回答