2017-10-12 5 views
0

SSISパッケージを作成して、ストアドプロシージャにクエリを実行し、結果セットをテーブルに格納します。この表には180億レコードの結果セットが含まれます。私は一意のキー列を持っていないので、私は動的に作成したrowno列を私は、宛先テーブルに格納されているストアドプロシージャを照会しています。SSIS最大論理チェックは機能しますが、データの移行に時間がかかります

ターゲットテーブルの最大値を取得し、maxを指定してソースをフィルタリングして、各移行でデルタのみを転送するSQL実行タスクを作成しました。私は最大のロジックが動作していることがわかります。デルタだけが移行されますが、転送するデータはありませんが、移行は遅いと感じています。

問題が何かわかりません。データがないのにプロセスの完了には同じ時間がかかりますが、データはありませんが、データがないことがわかります。あなたは、行の順序を信頼することはできません。

はここクエリ

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

まずによって呼び出された最大の論理です。そのため、少なくとも1つのタイムマーカでデータをフィルタリングする必要があります。 現在の問題は、SQL Serverが行を数えてフィルタリングできるように、クエリ全体を実行する必要があることです。 クエリの実行計画を見たことがありますか? 要約すると、送信データの量は限られていますが、ソース側のサーバーは大量のデータを読み取っています。だからこそこれほど長い時間がかかります。

カミル

http://SQLPlayer.net

+0

だから、解決策は何でしょう。 – Tom

+0

はい私は実行計画を見て、最適に最適化しました。あなたが言及したように、最大​​論理チェックがありますが、それはデータを照会し、フィルタリングする時間がかかります。 – Tom

+1

解決策は、現在のクエリおよび/または構造を少し再設計することである。ロジックがあるかもしれないが、すべてのテーブルをスキャンしないようにするには、最初にデータをフィルタリングするために増分(ID)マーカーまたはデータマーケットを見つける必要があります。申し訳ありませんが、構造(インデックスを含む)と表の統計情報がわからないので、私はあなたに準備ができていません。 –

関連する問題