2016-05-11 6 views
0

これは、値のない程度の異なる組み合わせである(明確なCOL1、テーブルからCOL2を選択)はどのように異なる値


私は新たにロードされたCSVファイルを持つテーブルを持っているの複数のセットを取得します。

一部の列は外部キーのディメンションにリンクされていますが、特定の列の値が参照表に存在しない場合があります。

私の望みは、ソーステーブルのテーブルスキャンの量を最小限に抑えるような方法で、存在しない各列のすべての値を見つけることです。

私の現在のアプローチは、以下のようなクエリの束の出力を消費:

SELECT DISTINCT col2 FROM table WHERE col2 NOT IN (SELECT val FROM DimCol2) 
SELECT DISTINCT col3 FROM table WHERE col3 NOT IN (SELECT val FROM DimCol3) 

ただし、N列の場合、これはNテーブルスキャンをもたらします。

は、最大5Mから5Mまでのカーディナリティで行と列の範囲が異なりますが、ほぼすべての値がすでにdimテーブル(> 99%)に存在しています。

DimColNは、5~50M値の範囲であり、良好な指標である。

csvはSSISを介してテーブルにロードされるため、SSIS内での前処理の分割は可能ですが、各行に対してSQLクエリを行わないといけません。

ssisサーバーにすべてのdimテーブルをキャッシュするのに十分なスペアRAMがありません。

+0

値には存在しないという意味、LEFT JOINを使用して確認する程度。私の望みは、ソーステーブルのテーブルスキャンの量を最小限に抑える方法で、存在しない各列のすべての値を見つけることです。私は努力していますが、私はあなたの質問を修正することに失敗していると感じています。 – billinkc

+0

@billinkcこれは私の質問の正しい再説です。私は言葉を明確にしようとします。 –

+0

ファクトテーブルをインポートするときに、すべての外部キー値が存在するように、参照テーブルへの変更をインポートして開始するのはなぜですか? –

答えて

0

何加入の結果がnullでどこに参照テーブルに存在しない可能性が与えられた列にDimCol2

SELECT DISTINCT Col2 
FROM table a 
LEFT JOIN DimCol2 on a.Col2 = b.val 
WHERE b.val IS NULL 
+0

はい、私はアプローチが少なくとも1つの新しい値(SELECT DISTINCT Col2、col3、col4、...)を持つ行のみに問題のサイズを縮小できると信じています FROM table a LEFT JOIN DimCol2 b on a.Col2 = b.val LEFT JOIN DimCol3 con a.Col3 = c.val LEFT JOIN DimCol4 b.val IS NULLかc.valがヌルかd.valがヌルです...)少なくとも1つの新しいvalとの組み合わせ。 –

+0

は、実行計画をチェックする価値があり、ボトルネックがどこにあるかを見ることができるように、ここにそれらを掲示する可能性があります – JanR

関連する問題