sql-server - 此查询的估计成本超出了配置的阈值 ssis

标签 sql-server sql-server-2008 ssis

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

The database has a query governor limit of 300

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

SET QUERY_GOVERNOR_COST_LIMIT 0 

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

Source: "Microsoft SQL Server Native Client 10.0 " Hresult: 0x80004005 Description: "The query has been canceled because the estimated cost of this query (336) exceeds the configured threshold of 300. Contact the system administrator.". End Error

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

最佳答案

除非您在软件包上设置了“保留相同连接”属性(这不是我所偏好的),否则您所遇到的就是documentation州。

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: Default Logging OnError don't work with RetainSameConnection

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

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

关于sql-server - 此查询的估计成本超出了配置的阈值 ssis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12563680/

相关文章:

mysql - 如何将格式化的 sql getdate() 插入到表中

sql-server - sql - 显示我可以支付的所有分期付款

c# - 在 .net core 3.0 上运行集成服务 SSIS

c# - EF DateTimes 与 SQL Server 中保存的值不匹配

sql-server - adArray 的 VBScript/ADODB 语法问题?

sql-server - SQL Server 2008 全文搜索 (FTS) 与 Lucene.NET

sql-server - 我应该从代理键中删除聚集索引吗?

xml - 从 Xml 输入返回行集

SQL查询限制记录

sql-server - 从字母数字字段中提取 6-8 位日期