2016-10-14 33 views
-1

我已經使用rank()生成了一個報告。查詢優化 - 窗口排序

select sa.COUNTRY, 
    sa.CITY, 
    to_char(sum(r.TOTAL_SERVICE_COST)) as Total_Service_Cost, 
    rank() OVER (PARTITION BY sa.COUNTRY 
    ORDER BY SUM(r.TOTAL_SERVICE_COST) Desc) as City_Rank_by_country 
from ROUTESFACT r,SOURCEAIRPORT_DIM sa 
where r.SOURCEAIRPORTID=sa.SOURCE_AIRPORTID 
GROUP BY sa.COUNTRY,sa.CITY; 

而且我得到以下執行計劃。 enter image description here

正如你看到的窗口排序和散列組沒有得到有效優化。 什麼是優化這個最好的方法?

+1

執行計劃對我來說很好。該查詢包含事實表中的所有行,並且聯接便宜,因此索引對此沒有幫助。如果數據分組並排名,則計劃中必須進行分組和排序操作。成本很小,所以並行性不值得。我沒有看到這個執行計劃的明顯問題。有沒有可以添加的信息? –

回答

1

首先,使用正確的,明確的join語法對您的查詢進行調整。一個整潔,正確編寫查詢更容易提高:

select sa.COUNTRY, sa.CITY, 
     to_char(sum(r.TOTAL_SERVICE_COST)) as Total_Service_Cost, 
     rank() OVER (PARTITION BY sa.COUNTRY 
        ORDER BY SUM(r.TOTAL_SERVICE_COST) Desc 
        ) as City_Rank_by_country 
from ROUTESFACT r join 
    SOURCEAIRPORT_DIM sa 
    on r.SOURCEAIRPORTID = sa.SOURCE_AIRPORTID 
group by sa.COUNTRY, sa.CITY; 

我不知道他們有多少幫助,但指標是一個良好的開端:SOURCEAIRPORT_DIM(Country, City, SOURCE_AIRPORTID)ROUTESFACT(SOURCEAIRPORTID, TOTAL_SERVICE_COST)

這些可能會幫助您查詢。

+0

非常感謝!創建索引確實優化了查詢。 – Ramprasath