1

誰かが私の SQL クエリを最適化するのを手伝ってくれませんか? データベースはpostgresです。私のテーブル構造は次のようになります。

create table test_table(test_id integer NOT NULL, sequence_id integer NOT NULL,value1 integer NOT NULL, value2 integer NOT NULL, CONSTRAINT test_table_pk PRIMARY KEY (test_id , sequence_id ))

create table test_event(event_id integer NOT NULL,test_id integer NOT NULL, sequence_id integer NOT NULL , CONSTRAINT test_event_pk PRIMARY KEY(event_id , test_id, sequence_id))

test_table
1,1, 200,300
2,2, 400,500
2,3, 600,700
2,4, 300,500
2,5, 200,900

test_event
1, 1,1
1, 2,2
1, 2,3
2, 2,4
2, 2,5

そして、sequence_id と test_id が test_event の event_id =1 に対応する test_table からすべての value1 と value2 を取得したいと考えています。私のクエリは次のようになります

SELECT
  value1, value2
FROM
  test_table
WHERE
  sequence_id IN (
    SELECT sequence_id
    FROM test_event
    WHERE event_id=1) AND
  test_id IN (
    SELECT test_id
    FROM test_event
    WHERE event_id=1)

これがこのクエリを記述する最適な方法であるかどうか、誰かに教えてもらえますか?

4

2 に答える 2

1

問題はsequence_id、 とtest_idが の同じレコードに由来する必要があるかどうかtest_eventです。たとえば、ペア (1, 2) は元のクエリを満たします。偶数 id 1 シーケンス id 2 は両方とも行にありますevent_id = 1が、同じ行にはありません。

あなたのinクエリは、おそらくこの関係を表現する最良の方法です。別の方法はjoin、集計を使用することです。

SELECT tt.value1, tt.value2
FROM test_table tt join
     test_event te
     on te.event_id = 1
group by tt.value1, tt.value2
having sum(case when tt.sequence_id = te.sequence_id then 1 else 0 end) > 0 and
       sum(case when tt.event_id = t2.event_id then 1 else 0 end) > 0;

inこれにより、 がjoin(基本的にクロス結合) および に置き換えられaggregationます。と のインデックスを使用するte.sequence_idte.event_id、元のバージョンの方が優れていると思います。

于 2013-07-02T02:05:28.027 に答える