在如何创建高效的数据库索引中,我们说到过,可以通过有序的索引(B+tree)来避免排序操作,从而提升查询的性能。但是如果排序子句或分组子句中的字段来自不同的表,那么数据库优化器就无法利用索引的有序性来避免一次排序操作。
但是如果能从查询中推断出排序字段与另一个表的某个字段具有等值的关系,可以使用此字段来替换原排序字段,从而利用索引的有序性,在进行排序或分组时避免一次排序操作,从而提升SQL查询性能。
譬如对于以下的SQL查询:
select customer.* from customer, orders where c_custkey=o_custkey order by c_name, o_custkey;
排序字段为 C_NAME, o_custkey,来自不同的两个表,但是在查询中条件c_custkey=o_custkey,所以可以用c_custkey来替换o_custkey, 重写后的SQL如下:
select customer.* from customer, orders where c_custkey=o_custkey order by c_name, c_custkey;
分组排序优化是针对查询块(Queryblock)来进行的,多个查询块可以独立进行此优化。分组排序优化的适用条件如下:
PawSQL针对所有数据库默认开启此优化,
PawSQL专注数据库性能优化的自动化和智能化,支持MySQL,PostgreSQL,Opengauss,Oracle等数据库,提供的SQL优化产品包括