查询优化——窗口排序

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)

这些可能对您的查询有所帮助。

【讨论】:

非常感谢!创建索引肯定会优化查询。

以上是关于查询优化——窗口排序的主要内容,如果未能解决你的问题,请参考以下文章

存储优化-排序引起的慢查询优化

MySQL高级第八篇:关联查询子查询和排序相关优化

优化查询 数据库优化

Rails 排序查询优化

Sql优化-多like模糊查询及根据时间排序

按优化排序复杂选择查询