除非您在包上设置了“保持相同的连接”属性,这不是我对它的价值的偏好,否则您所经历的就是文档所述。
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 可能会使工作花费更长的时间
- 如果您使用的是企业版并且正在使用分区,您可能能够加载到一个空分区并将其换入。我认为在这种情况下情况并非如此,因为分区如果做得不好会使问题变得更糟。