0

非常に遅いクエリを最適化する際に (技術的および概念的な) 問題が発生しています。

これは私の元のクエリです:

select Con_Progr,
    Pre_Progr
from contribuente,
    preavviso_ru,
    comune,
    via
where [lots of where clauses]
    and ((Via_Progr = Con_Via_Sec) or (Via_Progr = Con_Via_Res and (Con_Via_Sec is null or Con_Via_Sec = '0')))
order by Con_Cognome,
    Con_Nome asc;

このクエリの実行には約 38 秒かかりますが、これは非常に遅い時間です。私はそれを少し操作し、約 0.1 秒まで高速化することができました。クエリは次のようになります。

(select Con_Progr,
    Pre_Progr
from preavviso_ru
    join contribuente
        on Pre_Contribuente = Con_Progr
    join via
        on Via_Progr = Con_Via_Sec
    join comune
        on Via_Comune = Com_CC
where [lots of where clauses]
order by Con_Cognome,
    Con_Nome asc
)
union
(
select Con_Progr,
    Pre_Progr
from preavviso_ru
    join contribuente
        on Pre_Contribuente = Con_Progr
    join via
        on Via_Progr = Con_Via_Res
    join comune
        on Via_Comune = Com_CC
where [lots of where clauses]
    and (Con_Via_Sec is null or Con_Via_Sec = '0')
order by Con_Cognome,
    Con_Nome asc
)

ご覧のとおりOR、2 つの異なるサブクエリで演算子を使用した元のクエリの where 句を分割し、それらをマージしました。これで速度の問題は解決しました。ただし、結果は完璧ではありません。順序が失われたためです。次のように、サブクエリで列を選択し、その結果に対して順序付けを実行しようとしました。

select Con_Progr,
        Pre_Progr
from (
    [FIRST SUBQUERY]
) as T1 union (
    [SECOND SUBQUERY]
) as T2
order by Con_Cognome,
        Con_Nome asc

しかし、「 」の近くで構文エラーが発生しますunion。なにか提案を?

これは技術的な問題でした。概念的には、2 つのサブクエリは非常に似ていると思います (結合句と where 句のみが異なります)。2 番目のクエリ (高速なクエリ) をより洗練された方法で再配置する方法はありますか?

4

1 に答える 1

0

私は技術的な問題を解決しました、私は括弧を置き忘れました:

select Con_Progr,
    Pre_Progr
from (
    [FIRST SUBQUERY]
union
    [SECOND SUBQUERY]
) as T
order by Con_Cognome,
    Con_Nome asc

今ではほぼ完全に機能します(順序にはまだ多少の不一致がありますが、問題はありません。

クエリの効率については、ORMySQL 4.0(下位互換性の問題に使用しています)ではテーブルに1つのインデックスしか許可されていないため、問題は2つの異なる列の条件であることがわかりました。しかし、それでも、なぜそれらのインデックスの少なくとも1つを使用しないのですか。もう少しテストします...

于 2012-06-15T07:14:33.760 に答える