SSIS最大逻辑检查正在工作,但需要较长时间来迁移数据
问题描述:
我正在创建一个查询存储过程并将结果集存储到表中的SSIS包。该表将包含180亿条记录的结果集。由于我没有任何唯一的键列,因此我在查询存储在目标表中的存储过程时动态创建了rowno列。SSIS最大逻辑检查正在工作,但需要较长时间来迁移数据
我创建了一个执行SQL任务,该任务将获取目标表的最大值并使用max筛选源,以便仅在每次迁移时传输增量。我可以看到最大逻辑正在工作,只有delta被迁移,但我认为迁移是慢速事件,虽然没有数据要传输。
不确定是什么问题?我可以看到,虽然没有数据,但完成流程事件需要相同的时间,尽管没有数据。
下面是该查询
SELECT *
FROM
(SELECT
rowno = row_number() OVER (order by (SELECT NULL)) ,
fp.companyid,
fd.dataitemid,
di.dataitemname,
fd.dataitemvalue,
fu.unittypevalue,
fp.fiscalyear, fp.fiscalquarter,
fi.periodenddate, fi.filingdate,
rt.restatementtypename,
fi.latestforfinancialperiodflag, fi.latestfilingforinstanceflag,
conv.currencyconversionflag,
cur.currencyname,
pt.periodtypename
FROM
ciqfinperiod fp
INNER JOIN
CoreReferenceStaging.dbo.MarketDataTemp1 a ON a.companyId = fp.companyid
INNER JOIN
ciqperiodtype pt ON pt.periodtypeid = fp.periodtypeid
INNER JOIN
ciqfininstance fi ON fi.financialperiodid = fp.financialperiodid
LEFT JOIN
ciqrestatementtype rt ON rt.restatementtypeid = fi.restatementtypeid
INNER JOIN
ciqfininstancetocollection ic ON ic.financialinstanceid = fi.financialinstanceid
INNER JOIN
ciqfincollection fc ON fc.financialcollectionid = ic.financialcollectionid
INNER JOIN
ciqfincollectiondata fd ON fd.financialcollectionid = fc.financialcollectionid
INNER JOIN
ciqdataitemconversionrule conv ON conv.dataitemid = fd.dataitemid
INNER JOIN
ciqcurrency cur ON cur.currencyid = fc.currencyid
INNER JOIN
ciqdataitem di ON di.dataitemid= fd.dataitemid
INNER JOIN
ciqfinunittype fu ON fu.unittypeid = fd.unittypeid) q
WHERE
q.rowno > @maxrowno
是由执行任务
select COUNT_BIG(rowno) as rowno
from [CoreReferenceStaging].[dbo].[FinancialStatementIds]
答
首先叫的最大逻辑:你不能相信行的顺序。所以,从这个角度来看,您至少应该找到一个时间标记来过滤数据。 您当前的问题是,SQL Server必须执行整个查询才能够对行进行计数,然后执行过滤。 你见过查询的执行计划吗? 总结:发送数据量有限,但源端服务器正在读取大量数据。这就是为什么这需要很长时间。
卡米尔
那么,有什么解决办法。 – Tom
是的,我已经看到了执行计划并优化到最佳状态。正如你所提到的,虽然有一个最大逻辑检查,它需要时间来查询和过滤数据。 – Tom
解决方案是重新设计一下当前的查询和/或结构。我知道可能有一些逻辑,但如果你想避免扫描所有的表 - 必须找到增量(标识)标记或数据市场来初步过滤数据。对不起,我不能给你准备好解决方案,因为我不知道表的结构(包括索引)和统计信息。 –