0
我有一些麻煩(技術和概念)優化一些非常緩慢的查詢。與MySQL工會聯繫
這是我原來的查詢:
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;
這個查詢需要約38secs來執行,這是一個很慢的時間。我操縱它有點和管理,加快約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
運營商原有的查詢子句不同的子查詢,然後合併它們。這解決了速度問題。結果雖然並不完美,因爲我失去了訂購。我試圖選擇在子查詢中的列,然後對結果進行排序,像這樣:
select Con_Progr,
Pre_Progr
from (
[FIRST SUBQUERY]
) as T1 union (
[SECOND SUBQUERY]
) as T2
order by Con_Cognome,
Con_Nome asc
但我得到一個語法錯誤附近「union
」。任何建議?
這是技術問題。現在對於概念,我認爲這兩個子查詢是非常相似的(它們只有一個連接子句和一個where子句),有沒有辦法以更優雅的方式重新排列第二個查詢(快速的)?
它看起來不錯,所以我們需要測試,嘗試將表和一些行放在sqlfiddle.com並讓我們知道 – jcho360
我試過sqlfiddle了一下(順便說一句,我不知道它,謝謝^ _ ^)但它hasn這並沒有太大的幫助,因爲它給MySQL提供了很多關於錯誤的信息...... – goffreder
我很高興你解決了它,下面是如何使用sqlfiddle,http://www.vincepergolizzi.com/2012/04/how-to-use-sql-fiddle-or-help-us-to-help-you /,有時對你的「代碼」中的其他ppl測試更好,並找到不同的解決方案,我建議祝你好運 – jcho360