6

イベントをテーブルに挿入します - 開始イベントと終了イベントです。関連するイベントは同じ internal_id 番号を持ち、90 秒のウィンドウ内に挿入されます。テーブルで頻繁に自己結合を行います。

create table mytable (id bigint identity, internal_id bigint, 
internal_date datetime, event_number int, field_a varchar(50))

select * from mytable a inner join mytable b on a.internal_id = b.internal_id
and a.event_number = 1 and b.event_number = 2

ただし、毎日何百万ものリンクされたイベントを持つことができます. クラスター化されたキーは internal_date であるため、パーティション レベルまでフィルター処理できますが、パフォーマンスは依然として平凡です。

and a.internal_date >='20120807' and a.internal_date < '20120808'
and b.internal_date >='20120807' and b.internal_date < '20120808'

さらに絞り込む SARGable な方法はありますか? これを追加しても機能しません - SARGable ではありません:

and a.internal_date <= b.internal_date +.001 --about 90 seconds
and a.internal_date > b.internal_date - .001 --make sure they're within the window

これはポイント クエリ用ではないため、1 回限りのクエリを実行しても役に立ちません。何千ものレコードを検索しており、開始イベントと終了イベントからのイベントの詳細が必要です。

ありがとう!

4

1 に答える 1

0

このインデックスを使用すると、クエリのコストが大幅に削減されます。

CREATE UNIQUE INDEX idx_iid on mytable(event_number, internal_id)
INCLUDE (id, internal_date, field_a);

event_numberインデックスを使用すると、クラスター化インデックス スキャンを実行する代わりにシークを実行できinternal_id、ハッシュ結合ではなくマージ結合を実行できます。一意性制約により、多対多結合の可能性が排除され、マージ結合がさらに安価になります。

マージ結合の詳細については、こちらを参照してください。

于 2012-08-07T18:52:29.580 に答える