3

私はかなり長い(10テーブル、それぞれ約60kレコード)クエリを持っています。これらのテーブルはすべて、null値(すべて)を含む可能性があるため、左結合を使用して結合されます。

パフォーマンスが大幅に低下しているので、このコードまで追跡しました。

SELECT * 
FROM MAIN_TABLE d 
LEFT JOIN INSURANCES i on i.IMREDEM_CODE = d.IMREDEM_CODE 
                      and i.INS_TERMINATIONDATE IS NULL 
                      and INS_RANK = 0
                      and i.IMREINS_CODE = (SELECT TOP 1 IMREINS_CODE 
                                              from INSURANCES i2
                                             WHERE i2.IMREDEM_CODE = i.IMREDEM_CODE 
                                               and i2.INS_TERMINATIONDATE IS NULL 
                                               and i2.INS_RANK = 0
                                          ORDER BY TAG_SYSTEMDATE DESC)

基本的に、私がする必要があるのは、保険テーブルに0個以上のレコードが含まれる可能性があることです。これは、保険を更新すると、監査目的では更新ではなく挿入が実行されるためです。したがって、左側の結合でテーブルを2回結合する必要があります。さらに、一次保険と二次保険についてこのクエリを2回実行する必要があります(一次保険はランク= 0、二次保険はランク= 1です。IMREDEM_CODEはDテーブルのPKであり、iテーブルのFKです。

答えはここにあります

left join INSURANCES i on i.IMREDEM_CODE = d.IMREDEM_CODE 
and i.IMREINS_CODE = (SELECT max(imreins_code) FROM INSURANCES i2  WHERE i2.IMREDEM_CODE = i.IMREDEM_CODE and i2.INS_TERMINATIONDATE IS NULL and i2.INS_RANK = 0)
4

2 に答える 2

2

これをさらに最適化できると確信していますが、私はそれを簡単に突き止めました。実行プランは3つのテーブルスキャンを実行します。あなたはそれを2に減らすこれを試すことができます:

SELECT *
FROM Main_Table d
    LEFT JOIN 
        (SELECT TOP 1 *
         FROM Insurances 
         WHERE INS_TERMINATIONDATE IS NULL 
             AND INS_RANK = 0
         ORDER BY TAG_SYSTEMDATE DESC) i on i.IMREDEM_CODE = d.IMREDEM_CODE;

TOP1やOrderByよりも良いアプローチがあるかもしれませんが、私は疲れていて、今のところそれを考えることができません。いずれにせよ、これは間違いなくより効率的です。

これは、両方のクエリセットを使用したSQLフィドルです。それぞれに実行計画が表示されます。

幸運を。

于 2013-01-19T01:41:30.917 に答える
1

次の場合、まったく同じ結果が得られますが、より高速になると思います。

  SELECT * 
     FROM MAIN_TABLE d 
LEFT JOIN INSURANCES i on i.IMREDEM_CODE = d.IMREDEM_CODE 
                      and i.IMREINS_CODE = select max(i.imreins_code) from INSURANCES
                      and i.INS_TERMINATIONDATE IS NULL
                      and i.INS_RANK = 0
于 2013-01-19T01:24:56.183 に答える