2

データ ウェアハウスを構築していますが、2 つのテーブルのデータ比較ステートメントに問題があることがわかりました。EXCEPT 演算子を使用して、クラスター化されたインデックス (キーとして通常の int フィールド) を持つテーブルを比較します。私の問題は、クエリ実行プランで、両方のクラスター化インデックスがスキャンされた後に並べ替え演算子があることです。コード例を次に示します。

create table temp.table_a
(
    key_a int identity,
    some_field_a int,
    some_field2_a varchar(10)
);

insert into temp.table_a
(
    some_field_a,
    some_field2_a
)
select
    n,
    'abcd'
from meta.GENERATE_SEQUENCE(1,1000);

create clustered index cix_table_a_key_a on temp.table_a (key_a);


create table temp.table_b
(
    key_b int identity,
    some_field_b int,
    some_field2_b varchar(10)
);

insert into temp.table_b
(
    some_field_b,
    some_field2_b
)
select 
    n,
    'abcd'
from meta.GENERATE_SEQUENCE(1,1000);

create clustered index cix_table_b_key_b on temp.table_b (key_b);

(GENERATE_SEQUENCE は行ジェネレーターです)

EXCEPT クエリは次のとおりです。

select 
    key_a,
    some_field_a,
    some_field2_a
from temp.table_a

except

select 
    key_b,
    some_field_b,
    some_field2_b
from temp.table_b

実行計画のイメージは次のとおりです。

[実行計画]

Merge Join には並べ替えられた入力が必要であることは承知していますが、既に十分に並べ替えられていませんか? これは、必要なソートされた列は key_a/key_b だけであることを意味します。そして、これはクラスター化されたインデックスのために既に行われています。key_a/key_b のすべての値の内部には 1 つの行しかなく、並べ替えるものがないため、他の列の並べ替えは必要ありません。

だから、私の質問は次のとおりです。

  1. この状況でクラスター化インデックス スキャンの後に並べ替え演算子があるのはなぜですか?
  2. EXCEPT 演算子を使用する場合、これらの並べ替えを回避するにはどうすればよいですか?
  3. テーブル比較を行うためのより良い方法 (ある場合) は何ですか?

あなたの答えを前もってありがとう:)

4

2 に答える 2