web-dev-qa-db-ja.com

TSQLとSSISの検索

私は、SSIS Lookupコンポーネントに相当するTsqlの同等のものを見つけようとしていました。特にファクトテーブルのロード。

いくつかの異なるクエリパターンの後、最もobvが最高のパフォーマンスを発揮します。

 INSERT INTO Fact WITH (TABLOCK)
 SELECT 
  F.Attribute1,
  ...
  d1.DimAId,
  d2.DimBId,
  d3.DimCId,
  ...
  F.Amount
  ...
  from Staging.dbo.GeneralLedger F WITH(NOLOCK)

  LEFT OUTER JOIN  DimA1 d1 WITH(NOLOCK)
                on d1.AId = F.AId

  LEFT OUTER JOIN DimB d2 WITH(NOLOCK)
                on d2.BId = F.BId

  LEFT OUTER JOIN DimC d3 WITH(NOLOCK)
                on d3.CId = F.CId

パフォーマンスに関しては、500万行と9次元のルックアップでこれをテストしました。

SSIS:1分14秒TSQL:1分0秒

大規模なデータセット(+1億行)でSSISよりもTSQLを選択した場合の影響これは、現在200GB RAMサーバーでテストしたので、メモリ内のすべてに適合する問題はありません。

ただし、このクエリをRAMの少ないマシンで使用すると、ディスクに溢れ出し、パフォーマンスが大幅に低下すると思います。 SSISはメモリよりも効率的です。この仮定は正しいですか?

私が頭に浮かぶもう1つのアイデアは、カーソルループを使用して、すべてのデータが読み込まれるまでの間に、1M行の例のtsqlでのみこれを行うことです。これを行うことで、メモリが不足してディスクに無駄を費やす機会が少なくなります。これは実行可能なアプローチですか、それとも他のアプローチですか?

PS:SSISがファクトテーブルの読み込みに使用する方法であることは十分に承知しています。ただし、TSQLのみが必要であると仮定します。 PS2:Stackoverflowにも投稿された質問 https://stackoverflow.com/questions/26638590/tsql-vs-ssis-lookup 。ただし、画期的な対応はありません。

5
OverflowStack

大きなデータセットを小さなデータセットにバッチ処理する。 100,000行または1,000,000行は、1つの大きな挿入よりもロードの実行を改善します。ただし、挿入をバッチ処理するため、SSISについても同じことが言えます。

あなたの例で示す時間の違いはかなり小さいです。これにより、速度が大幅に向上することは期待できませんが、他のインポート方法を使用できることを知っておく必要があります。

[〜#〜]編集[〜#〜]以下に含まれます。

最初に.csvファイルに抽出する場合は、おそらくBCPを使用してビューから.csvファイルに抽出します。次に、BULK INSERTを使用して、そのファイルをデータベースにロードできます。

BULK INSERTの説明: http://msdn.Microsoft.com/en-us/library/ms188365.aspx

TSQLですべてのインポートを実行する場合は、BULK INSERTコマンドを使用できます。パラメータとして見ると、バッチサイズを制御するメソッドとしてKILOBYTES_PER_BATCHおよびROWS_PER_BATCHが含まれていることがわかります。

BCPBULK INSERTの速度と、バッチサイズの制御のため、これはより速い方法の1つだと思います使用する。ただし、中間の.csvファイルが必要です。

その他の問題:データは同じサーバーからのものですか、それとも別のサーバーからのものですか?同じサーバーの場合、アクセスはかなり東です。別のサーバーがあり、中間の.csvファイルが不要な場合は、リンクサーバーを作成して、他のサーバーからのデータをクエリできます。

ただし、ご指摘のとおり、これはバッチを自分で管理する必要があることを意味します。これは、「カーソルループ」として説明したものと似ていますが、おそらくカーソルは必要ありません。コピーする次の「n」行を選択するループのみです。データが別のサーバーにある場合、このアプローチのオーバーヘッドは高くなります。

4
RLF

すべてのケースに当てはまる答えはありません。ただし、一般的には...

ルックアップリストが小さく、キャッシュできる場合(またはキャッシュデータソースを使用できる場合)、SSISで実行してもパフォーマンスはそれほど低下しません。都市の名前に50のロケーションコードのリストを相互参照する場合は、それを使用してください。 SQLステートメントに埋もれるのではなく、画面上のすべてのプロセスを1か所で見るのはいいことです。

TSQLはほとんどの場合パフォーマンスが向上します。これは、TSQLがデータについて最もよく知っていて、クエリオプティマイザーが常にユーザーよりも賢くなるからです。すべてのデータが1つのDBにある場合、SQLクエリソースの多くの複雑さを隠すことができます。

データが複数のシステムに分散している場合、中心的な役割は、各システムからSSISマージ結合を実行することです。 RDBMSレベルでそれを行おうとするのは狂気です。ただし、常にソースクエリで並べ替えを行います。 SSISの並べ替えは、ほとんどの場合悪い考えです。

2
Jeff Sacksteder