我正在创建一个SSIS包,用于查询存储过程并将结果集存储到表中。该表将包含180亿条记录的结果集。由于我没有任何唯一的键列,因此我在查询存储在目标表中的存储过程时动态创建了一个rowno列。
我创建了一个执行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]
答案 0 :(得分:2)
首先:你不能相信行的顺序。因此,对于这种观点,您应该找到至少一个过滤数据的时间标记。 您当前的问题是SQL Server必须执行整个查询才能计算行数,然后进行过滤。 你看过查询的执行计划了吗? 总结一下:发送数据的数量有限,但源端的服务器正在读取大量数据。这就是为什么这需要很长时间。
卡米尔