大数据与SQL
1.SQL的处理流程
\
(1)Parser
●String-> AST ( abstract syntax tree )
V词法分析:拆分字符串,得到关键词、数值常量、字符串常量、运算符号等token
V语法分析:将token组成ASTnode,最终得到一个AST
●实现:递归下降(ClickHouse),Flex 和Bison (PostgreSQL),JavaCC (FIlink) ,Antlr (Presto, Spark)
(2)Analyzer和Logical Plan
●Analyzer
(检查并绑定Database, Table, Column等元信息
r SQL的合法性检查,比如min/max/avg的输入是数值
V AST -> Logical Plan
●Logical Plan
V逻辑地描述SQL对应的分步骤计算操作
r计算操作:算子( operator )
(3)查询优化
●SQL是一种声明式语言,用户只描述做什么,没有告诉数据库怎么做
目标:找到一个正确且执行代价最小的物理执行计划
●查询优化器是数据库的大脑,最复杂的模块,很多相关问题都是NP的
●-般SQL越复杂,Join的表越多,数据量越大,查询优化的意义就越大, 5219因为不同执行方式的性能差别可能有成百上千倍
2.查询优化器分类
(1)RBO
●主流RBO实现- -般都有几百条基于经验归纳得到的优化规则
●优点:实现简单,优化速度快
●缺点:不保证得到最优的执行计划
单表扫描:索引扫描(随机1/O) vs. 全表扫描(顺序I/O )
如果查询的数据分布非常不均衡,索引扫描可能不如全表扫描r Join 的实现: Hash Join vs. SortMerge Join
两表Hash Join :用小表构建哈希表如何识别小表 ?
多表Join:
哪种连接顺序是最优的?
是否要对每种组合都探索?
N个表连接,仅仅是left-deep tree就有差不多N!种连接顺序r e.g. N= 10->总共3, 628, 800个连接顺序
(2)CBO
●CBO 使用代价模型和统计信息估算执行计划的代价
●CBO 使用贪心或者动态规划算法寻找最优执行计划
●在大数据场景下CBO对查询性能非常重要
●主流RBO实现-般都有几百条基于经验归纳得到的优化规则. RBO实现简单,优化速度快
●RBO不保证得到最优的执行计划
●CBO使用代价模型和统计信息估算执行计划的代价
●CBO 使用贪心或者动态规划算法寻找最优执行计划
大数据场景下 CBO对查询性能非常重要