0

たとえば、次のような 2 つのテーブルがあります。

表1:

Column1
0001
0002
000a

表 2:

Column2
0001
0002
000a

Column1 と Column2 の両方のデータ型は varchar(10) です。2 つのテーブルを結合する必要があるため、クエリは

Select * from Table1 join Table2 on Table1.Column1 = Table2.Column2

しかし、varchar 型の結合 2 テーブルは、数値型の結合 2 テーブルよりもはるかに遅いことがわかっています (私のテーブルには数百万行あります)。試してみようと思います

Select * from Table1 join Table2 on Cast(Table1.Column1 as int) = 
Cast(Table2.Column2 as int)

通常、それはうまく機能し、はるかに高速です。しかし、行 3 (000a) のように例外が発生した場合、クエリは壊れます。だから、私は次のようなクエリを見つけたい:

Select * from Table1 join Table2 on
try
    Cast(Table1.Column1 as int) = Cast(Table2.Column2 as int)
catch if exception then
    Table1.Column1 = Table2.Column2

アップデート: - - - - - - - - - - - - - - - - - - - - - - - - ------------------------------------

私には理想があります:

まず、try_cast を使用して数値データの行を選択します。

select * from Table1 t1
join Table2 t2 
on try_cast(t1.Column1 as bigint) =try_cast(t2.Column2 as bigint)

その後、try_cast が null になる行 (例外行) を選択します。

select * from 
(select * from Table1 t1 where try_cast(t1.Column1 as bigint) is NULL and 
t1.Column1 is not NULL) as table1
join
(select * from Table2 t2 where try_cast(t2.Column2 as bigint) is NULL and 
t2.Column2 is not NULL) as table2
on table1.Column1=table2.Column2

最後に、2 つの結果をすべて結合すると、必要なものが得られます。私はテストを受けますが、それはかなり速いです。私の理想に何か問題があるか、私が忘れている何かがある場合は、私に知らせてください!

4

1 に答える 1

0

整数を使用して結合したい場合、一部の条件では高速なアプローチがありますが、データを知っている必要があります: 値を数値に変換します。数値を取得するという考え方は、次のように機能します。

SELECT Column1,
   ASCII(SUBSTRING(c1, 1, 1)) * 256 * 256 * 256
 + ASCII(SUBSTRING(c1, 2, 1)) * 256 * 256
 + ASCII(SUBSTRING(c1, 3, 1)) * 256 
 + ASCII(SUBSTRING(c1, 4, 1)) AS Column1Num
FROM Table1

結果:

Column1    Column1Num
---------- -----------
0001       808464433
0002       808464434
000a       808464481

これは、すべての値が4文字の長さであるという例に固執します。重要なのは、すべての一意の値に対して一意の番号を作成し、すべてのレコードに適用できる式を見つけることです。次に、この式を のキーとして使用しますJOIN

  • すべての値が同じ長さでない場合は、(SPACE()関数などで)補正できます。
  • 数字が実際に 16 進数 (0123456789abcdef) の場合、商を適用する前に、すべての数字を値 0..15 に変換した後、商を から256に減らすことができます。16
  • これは代替アプローチを示すためのものです。データを知っていると、最適な計算式が示される可能性がありますが、そのような計算が不可能であることも示される可能性があります

主なヒント:すべてのアプローチ ( [1] varchars への参加、[2]質問の更新からのアプローチ、[3]この回答で提案されているアプローチ) のパフォーマンスを評価し、最速のものを選択します。

于 2013-08-16T21:52:41.777 に答える