非常に遅いクエリを最適化する際に (技術的および概念的な) 問題が発生しています。
これは私の元のクエリです:
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 番目のクエリ (高速なクエリ) をより洗練された方法で再配置する方法はありますか?