2016-10-14 5 views
-1

Я создал отчет, используя rank().Оптимизация запроса-Window sort

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

Смежные вопросы