1. 案例
取所有不为掌门人的员工,按年龄分组!
select age as '年龄', count(*) as '人数' from t_emp where id not in
(select ceo from t_dept where ceo is not null) group by age;
如何优化?
①解决dept表的全表扫描,建立ceo字段的索引:
此时,再次查询:
②进一步优化,替换not in。
上述SQL可以替换为:
select age as '年龄',count(
(1) 来自pg文档
PostgreSQL使用的是基于成本的优化器(Cost based optimizer)。理论上基于成本的优化器会计算用户输入的查询语句的每个合法的查询计划的执行成本,然后从中选择成本小的计划作为执行查询语句的终计划。在实际应用中,查询语句的合法的查询计划的个数是随查询复杂度的增加呈指数增长的。对于过于复杂的查询,如果遍历每个合法的查询计划,将会消耗掉大量的时间,这是不能被用户接受的,所以优化器不会遍历每个合法的查询计划,只会选择一部分查询计划,从中找到执行成本小的计