SSIS max逻辑检查工作,但需要更长的时间来迁移数据

时间:2017-10-12 22:14:49

标签: sql-server ssis

我正在创建一个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]

1 个答案:

答案 0 :(得分:2)

首先:你不能相信行的顺序。因此,对于这种观点,您应该找到至少一个过滤数据的时间标记。 您当前的问题是SQL Server必须执行整个查询才能计算行数,然后进行过滤。 你看过查询的执行计划了吗? 总结一下:发送数据的数量有限,但源端的服务器正在读取大量数据。这就是为什么这需要很长时间。

卡米尔

http://SQLPlayer.net