2017-10-12 358 views
0

我正在创建一个查询存储过程并将结果集存储到表中的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] 

回答

2

首先叫的最大逻辑:你不能相信行的顺序。所以,从这个角度来看,您至少应该找到一个时间标记来过滤数据。 您当前的问题是,SQL Server必须执行整个查询才能够对行进行计数,然后执行过滤。 你见过查询的执行计划吗? 总结:发送数据量有限,但源端服务器正在读取大量数据。这就是为什么这需要很长时间。

卡米尔

http://SQLPlayer.net

+0

那么,有什么解决办法。 – Tom

+0

是的,我已经看到了执行计划并优化到最佳状态。正如你所提到的,虽然有一个最大逻辑检查,它需要时间来查询和过滤数据。 – Tom

+1

解决方案是重新设计一下当前的查询和/或结构。我知道可能有一些逻辑,但如果你想避免扫描所有的表 - 必须找到增量(标识)标记或数据市场来初步过滤数据。对不起,我不能给你准备好解决方案,因为我不知道表的结构(包括索引)和统计信息。 –