查询优化的必要性(转)
查询优化的最终目的是为了提高数据库系统的性能,但查询为什么在效率上会有差别呢?对于SQL查询,由于相同的表存在不同的存取方法;两个表的连接存在不同的连接方法;多个表的连接也存在不同的连接次序.因此,对于一个给定的查询通常会存在很多等价的执行计划,这些执行计划的输出结果相同,但是执行效率的差别往往很大。下面的例子可以说明不同执行计划在效率上的差别。
假设在一个数据库中包括以下几种关系:
雇员信息:emp(name,age,Sal,dno)
部门信息:dept(dno,dname,rloor,budget,mgr,ano)
账目信息:aent(ano,type,balanee,bno)
银行信息:bank(bno,bname,address)
接下来考虑这样一个简单的SQL查询:
SELECT name,floor
FROM emp,dept
WHERE emp.dno=dept.dno AND sal>100K
相关的参数信息假设如下表2一1所示.
考虑下面三种不同的执行计划:
P1:通过B+树找出emp中所有满足工资大于IOOK的元组,然后用hash索引找出相应的dept中的元组;
P2:对于每个dept中的页,扫描整个emp关系。若emp中的元组满足工资条件大于100K,并且部门号与dept页中的元组相等,那么这两个元组形成的新的元组将作为查询结果中的元组;
P3:对于dopt的每个元组,扫描整个emp关系并存储所有的emp-dopt元组对。然后扫描这些元组对,检查每个元组的两个dno属性是否相等并且工资是否大于100K。
计算以上三个计划的I/0代价,就可以看出其效率的不同。P1大约需要0.32秒,P2需要一个小时甚至更多,而P3需要超过一天的时间。由此可见,不同的执行计划之间的效率差异是很大的。如果没有查询优化技术的帮助,数据库的查询处理器很可能会生成最差的执行计划来执行,这必将大大的损害数据库系统的性能。而查询优化则可以列有可能的计划,并通过一定的方法选择出较好的、代价较小的计划来执行,从而提查询的效率。