查询优化——窗口排序
Posted
技术标签:
【中文标题】查询优化——窗口排序【英文标题】:Query optimisation- Window sort 【发布时间】:2016-10-14 00:15:49 【问题描述】:我使用 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;
我得到以下执行计划。
如您所见,窗口排序和散列分组依据并未得到有效优化。 对此进行优化的最佳方法是什么?
【问题讨论】:
执行计划对我来说看起来不错。该查询包括事实表中的所有行,并且连接很便宜,因此索引在那里无济于事。如果对数据进行分组和排序,那么计划中就必须有分组和排序操作。成本很小,所以并行性不值得。我没有看到这个执行计划有明显的问题。有什么可以补充的吗? 【参考方案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)
。
这些可能对您的查询有所帮助。
【讨论】:
非常感谢!创建索引肯定会优化查询。以上是关于查询优化——窗口排序的主要内容,如果未能解决你的问题,请参考以下文章