查询处理是指从数据库中提取数据时所涉及的一系列活动,包括:将高层数据库语言表示的查询语句翻译为可在文件系统的物理层上使用的表达方式、为优化查询进行的各种转换、以及查询的实际执行度。
语法分析
SQL编辑器接收SQL语句并生成相应的语法树然后读取字典信息进行语法验证,如果有错误则返回错误。
另外,如果该语句被多次执行,则可以根据SQL缓存信息,直接执行对应的可执行代码,不需要对此类SQL语句进行“翻译”,可以大大提高某些经常被执行的SQL语句的效率。为此,GBase 8s提供了SQL statement caching的机制,可以通过Onconfig参数文件的STMT_CACHE等参数进行该功能的开启、关闭及相关控制。为了更好地利用该功能,在开发应用程序调用SQL语句时,应尽量通过绑定变量的方式。因为只有完全相同的SQL语句才被匹配,简单理解为对SQL语句进行字符串的匹配以找到已执行的SQL语句。
语义检查
为了确保SQL语句的所有组成部分都符合要求,需要进行语义检查。举个简单的例子,时间类型字段传递的值需要满足时间格式的要求。例如select * from orders where order_date=’2015-5-12 10:00:00’,针对该SQL查询语句,需要验证’2015-5-12 10:00:00’是否满足当前数据库环境中对时间格式的设置要求。
SQL重写
由于某些提交给数据库的SQL语句存在明显的性能问题,所以SQL编译器只需进行简单的重写即可以达到更好的性能效果。
示例1.提升谓词
原SQL如下:
SELECT * FROM tab1
WHERE tab1.c1 = 10 and tab1.c2 =
(SELECT max (tab2.c2) FROM tab2 WHERE tab2.c1 = tab1.c1)
重写后的SQL如下:
SELECT * FROM tab1
WHERE tab1.c1 = 10 and tab1.c2 =
(SELECT max(tab2.c2) FROM tab2 WHERE tab2.c1 =10)
示例2.“扁平化子查询”
把子查询重写为表关联的方式,可以提高查询性能。
原SQL如下:
SELECT t1.c1
FROM t1
WHERE t1.c2 > ANY
(SELECT t2.c2 FROM t2 WHERE t2.c3 = t1.c3)
重写后的SQL如下:
SELECT t1.c1
FROM t1,t2
WHERE t2.c3 = t1.c3 and t2.c2 < t1.c2
示例3.IN转换为OR
在某些情况下,可以利用所有OR运算,将IN谓词转换为一组OR子句。
原SQL如下:
select * from orders
where order_num in(‘1001’,’1002’)
and order_date=’01/30/2015’
重写后SQL如下:
Select * from orders
where (order_num = ‘1001’ or order_num = ‘1002’)
and order_date = ‘01/30/2015’
优化器
如果选择的是基于代价的优化器模式,则需要读取相关统计信息,以确定最优的执行方案。对于多个索引情况及含有多表连接的情况,优化器需要确定索引的优先使用情况。表的扫描顺序,综合考虑执行路径的成本,最终选择一个最优的执行计划。据此,我们需要对发生数据变化的表及时执行update statistics,以保证优化器能依据有效的统计信息做出最佳的执行计划。
一旦选定了查询计划,即用该计划来执行查询并输出查询结果。