优化 让SQL起飞( 三 )


频繁使用中间表会带来两个问题,一是展开数据需要耗费内存资源,二是原始表中的索引不容易使用到(特别是聚合时) 。因此,尽量减少中间表的使用也是提升性能的一个重要方法 。
3.1 使用HAVING子句对聚合结果指定筛选条件时,使用HAVING子句是基本原则 。不习惯使用HAVING子句的人可能会倾向于像下面这样先生成一张中间表,然后在WHERE子句中指定筛选条件 。例如下面:
SELECT *FROM (SELECT sale_date, MAX(quantity) max_qtyFROM SalesHistoryGROUP BY sale_date) tmp WHERE max_qty >= 10然而,对聚合结果指定筛选条件时不需要专门生成中间表,像下面这样使用HAVING子句就可以 。
SELECT sale_date, MAX(quantity)FROM SalesHistory GROUP BY sale_dateHAVING MAX(quantity) >= 10;HAVING子句和聚合操作是同时执行的,所以比起生成中间表后再执行的WHERE子句,效率会更高一些,而且代码看起来也更简洁 。
3.2 对多个字段使用IN当我们需要对多个字段使用IN条件查询时,可以通过 || 操作将字段连接在一起变成一个字符串处理 。
SELECT *FROM Addresses1 A1 WHERE id || state || cityIN (SELECT id || state|| cityFROM Addresses2 A2);这样一来,子查询不用考虑关联性,而且只执行一次就可以 。
3.3 先进行连接再进行聚合连接和聚合同时使用时,先进行连接操作可以避免产生中间表 。原因是,从集合运算的角度来看,连接做的是“乘法运算” 。连接表双方是一对一、一对多的关系时,连接运算后数据的行数不会增加 。而且,因为在很多设计中多对多的关系都可以分解成两个一对多的关系,因此这个技巧在大部分情况下都可以使用 。
到此本文讲解完毕,感谢大家阅读,感兴趣的朋友可以点赞加关注,你的支持将是我更新动力 。




推荐阅读