这是我参与「第四届青训营 」笔记创作活动的的第1天
String→AST
词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token 语法分析:将token组成AST node,最终得到一个AST 实现:递归下降,Flex和Bison,JavaCC,Antlr
SELECT country.name,SUM(weblog.bytes)as total FROM country INNER JOIN geoip ON country.id=geoip.country_id INNER JOIN weblog ON geoip.host=web;og.host WHERE weblog.reply="200"and weblog.host is not null GROUP BY total LIMIT 10
查询优化器的分类:
Top-down Optimizer:从目标输出开始,由上往下遍历计划树,找到完整的最优执行计划 Bottom-up Optimizer:从零开始,由下往上遍历计划树,找到完整的执行计划。 Rule-based Optimizer:根据关系代数等价语义,重写查询;基于启发式规则;会访问的元信息,不会涉及具体的表数据 Cost-based Optimizer:使用一个模型估算执行计划的代价,选择代价最小的执行计划
RBO-列裁剪:
SELECT pv,siteld,user.name FROM pv JOIN user ON pv.siteld=user.siteld AND pv.userld=user.id WHERE user.siteld>123;
CBO-统计信息:
原始表统计信息:表或者分区级别:行数、行平均大小、表在磁盘中占多少字节 推导统计信息: 选择率:对于某一个过滤条件,查询会从表中返回多大比例的数据 基数:在查询计划中常指算子需要处理的行数
CBO-统计信息的收集方式:
CREATE TABLE REGION( R_REGIONKEY INT NOT NULL, R_NAME CHAR(25) NOT NULL, R_COMMENT VARCHAR(152)) DUPLICATE BY HASH(R_REGIONKEY)BUCKETS 1 PROPERTIES(""); 通常使用贪心算法或者动态规划选出最优的执行计划
HepPlanner:
优化规则:Pattern:匹配表达式子树 等价变换:得到新的表达式 四种匹配规则:ARBITRARY/DEPTH_FIRST:深度优先 TOP_DOWN:拓扑排序 BOTTOM_UP:与TOP_DOWN相反 遍历所有的rule,直到没有rule可以被触发 优化速度快,实现简单,但是不保证最优
VolcanoPlanner:
基于Volcano/Cascade框架 成本最优假设 Memo:存储候选执行计划 Group:等价计划集合 Top-down:动态规划搜索
标题:「SQL Optimizer 解析」第四届字节跳动青训营 - 大数据专场