2012-06-14 33 views
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子句),有沒有辦法以更優雅的方式重新排列第二個查詢(快速的)?

+1

它看起來不錯,所以我們需要測試,嘗試將表和一些行放在sqlfiddle.com並讓我們知道 – jcho360

+0

我試過sqlfiddle了一下(順便說一句,我不知道它,謝謝^ _ ^)但它hasn這並沒有太大的幫助,因爲它給MySQL提供了很多關於錯誤的信息...... – goffreder

+1

我很高興你解決了它,下面是如何使用sqlfiddle,http://www.vincepergolizzi.com/2012/04/how-to-use-sql-fiddle-or-help-us-to-help-you /,有時對你的「代碼」中的其他ppl測試更好,並找到不同的解決方案,我建議祝你好運 – jcho360

回答

0

我解決了趙彤問題,我忘記了括號:。

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

現在,它的工作原理幾乎完全(還是有一點差異的排序,但它不是一個問題

關於效率的問題,我發現問題是在兩個不同列上的OR條件,因爲MySQL 4.0(我用於向後兼容性問題)只允許一個表索引,但是,爲什麼它至少不使用其中一個指標,我會再測試一下......