-1

このような要件があります。過去800日間取引を行っていないすべての顧客を削除する必要があります。

私はcustomerIDが主キーであるテーブルcustomerを持っています *クレジットカードテーブルには列customerID、CreditcardIDがあります。ここでcreditcardは主キーです* 列transactiondatetime、CreditcardID、CreditcardTransactionIDを持つトランザクションテーブルはこのテーブルの主キーです。

すべてのトランザクション可能なデータはCreditcardTransactionというビューにあるので、このビューを使用して情報を取得しています

CreditcardTransactionビューのデータ量は約6000万データであるため、過去800日間トランザクションを実行したクレジットカードを取得し、CreditcardIDを取得してテーブルに保存するクエリを作成しました。このクエリは失敗し、ログに記録されます。メッセージログファイルがいっぱいで、メッセージシステムのメモリ不足例外がスローされます。

INSERT INTO Tempcard  
       SELECT CreditcardID,transactiondatetime 
       FROM  CreditcardTransaction WHERE   
       DATEDIFF(DAY ,CreditcardTransaction.transactiondatetime ,getdate())>600 

CreditcardIDを取得する必要があるので、最後のTransactiondatetimeはいつでしたか

それらのデータをExcelシートに表示する必要があるので、テーブルにデータをダンプしてから、Excelに挿入します。

私が示す最良の解決策は何ですか

私はSSISパッケージ(vs 2008 R2)を使用しており、SPダンプデータをテーブルに呼び出してから、いくつかのビジネスロジックを実行して、最終的にExcelシートにデータを挿入します。

ありがとう王子

4

2 に答える 2

1

1 つの考え: Where 句で関数を使用すると、処理が大幅に遅くなる可能性があります。IdleTransactionDays という名前の列を追加することを検討してください。これにより、Select 句で DateDiff 関数を使用できるようになります。後で、Tempcard テーブルをクエリして、IdleTransactionDays が 600 を超えるレコードを返すことができます。これは次のようになります。

宣言 @DMinus600 datetime = INSERT INTO Tempcard (CreditcardID,transactiondatetime,IdleTransactionDays) SELECT CreditcardID,transactiondatetime, DATEDIFF(DAY ,CreditcardTransaction.transactiondatetime ,getdate()) FROM CreditcardTransaction

IdleTransactionDays>600 の Tempcard から * を選択

これが役に立てば幸いです、アンディ

于 2012-04-17T19:52:10.683 に答える
0

現在、これらのレコードを行ごとに挿入しています。OLEDB ソース コンポーネントを使用してデータを読み取り、必要な操作を実行して、それらを宛先テーブルに一括挿入(最小限にログに記録される操作) する SSIS パッケージを作成できます。

行を Excel ファイルに直接出力することもできます。行を中間テーブルに書き込むと、パフォーマンスが低下します。

ソース クエリがまだタイムアウトする場合は、インデックスが存在するかどうか、およびインデックスが断片化しすぎていないかどうかを調べます。

ソース データを年ごとに分割することもできます (transactiondatetime に基づく)。このようにして、データはバーストでロードされます。

于 2012-04-13T07:52:45.557 に答える