grouping_planner主要做了3个工作: 对集合进行处理 对非SPJ函数进行优化 对SQL查询语句进行物理优化 grouping_planner实现代码如下: static void grouping_planner(PlannerInfo *root, bool inheritance_update, double tuple_fraction) { /* 如果存在limit,offset,元组片段因子要改小 */ if (parse->limitCount || parse->l…
简介 PostgreSQL查询优化器执行过程 语法分析:生成查询树 语义检查:对SQL表达的语义进行检查 查询优化 视图重写 逻辑优化:子查询优化,条件化简,等价谓词重写,连接消除,得到逻辑计划 物理优化:基于代价优化,得到物理计划.PostgreSQL主要采用动态规划和遗传算法 非SPJ优化:主要针对分组,排序,去重等操作 查询计划执行 在PostgreSQL中,语法树并不是一棵树状结构的,把关系平面化到一个链表里面.因为,PostgreSQL认为,在这个阶段不清楚表之间如何链接. 重要数据结…
上一节我们介绍了PostgreSQL的子查询优化,子查询优化把一部分可以优化的子查询上拉到主查询成为join. preprocess_expression 将表达式(目标列,where,join,having)简化表达式 static Node * preprocess_expression(PlannerInfo *root, Node *expr, int kind) { /* * If the query has any join RTEs, replace join alias vari…
子查询优化 上拉子连接 上拉子连接主要是把ANY和EXIST子句转换为半连接 void pull_up_sublinks(PlannerInfo *root) { Node *jtnode; //子连接上拉生成的结果 Relids relids; /* Begin recursion through the jointree ,jointree代表From和join子句*/ jtnode = pull_up_sublinks_jointree_recurse(root, (Node *) roo…
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 本文翻译了如下章节, 介绍数据库查询优化器的数据访问方式: Access Path–数据访问方法 在执行联表操作之前先要获取数据.现在讲一下获取数据有哪些方式. Note:由于所有获取数据方式的关键都是磁盘I/O,所以我不会在…
本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-databases-work/#Buffer-Replacement_strategies 本文翻译了如下章节, 介绍数据库的查询优化器索引: Indexes–索引 我们已在介绍B+树的章节讲过索引(译者:此章不再细讲).仅需要记住的一点是索引已经排好序了. 当然,还有其它类型的索引,例如bitmap indexes…
下面这些sql都含有子查询: mysql> select * from t1 where a in (select a from t2); mysql> select * from (select * from t1) as t; 按返回的结果集区分子查询 1.标量子查询 那些只返回一个单一值的子查询称之为标量子查询.比如: select * from t1 where a in (select max(a) from t2); 2.行子查询 返回一条记录的子查询,不过这条记录需要包含多个列.…
连接查询应该是比较常用的查询方式,连接查询大致分为:内连接.外连接(左连接和右连接).自然连接 下图展示了 LEFT JOIN.RIGHT JOIN.INNER JOIN.OUTER JOIN 相关的 7 种用法. 内连接 以下三种写法都是内连接: mysql> select * from t1 join t2 on t1.a = t2.a; mysql> select * from t1 inner join t2 on t1.a = t2.a; mysql> select * fro…
对于一个SQL语句,查询优化器先看是不是能转换成JOIN,再将JOIN进行优化 优化分为: 1. 条件优化 2.计算全表扫描成本 3. 找出所有能用到的索引 4. 针对每个索引计算不同的访问方式的成本 5. 选出成本最小的索引以及访问方式 开启查询优化器日志 -- 开启 set optimizer_trace="enabled=on"; -- 执行sql -- 查看日志信息 select * from information_schema.OPTIMIZER_TRACE; -- 关闭…
数据库查询优化器的艺术 作者:李海翔 Oracle公司MySQL全球开发团队.资深专家 简单的浏览了一遍,由于以前没有接触过SQL优化这些知识,读起来还是非常吃力的,不过收获还是很大的. 作者通过对Mysql.PostgreSQL这两个开源数据库查询优化器的对比,深入介绍了数据库查询优化这方面的知识. 本书开篇首先介绍了数据库查询优化的技术原理,数据库查询优化分为逻辑查询优化.物理查询优化,然后分别介绍了Mysql查询优化器的架构.原理以及具体实现,最后又对比的介绍了PostgreSQL查询优化…