Oracle性能调整与优化第二部分(二)

日期: 2008-12-11 作者:Steve Callan翻译:黄永兵 来源:TechTarget中国 英文

  使用效率高的SQL

  假设你在下面的两个查询中做一个选择(再次使用HR方案):

  查询1


select d.department_id, 
d.department_name, 
r.region_name
from departments d, 
locations l, 
countries c, regions r
where d.location_id=l.location_id
and l.country_id=c.country_id
and c.region_id=r.region_id;

  和


select department_id, 
department_name, 
region_name
from departments natural join locations
natural join countries natural join regions;

  这产生了四个问题。

  1、这些查询的查询结果集一致吗?

  2、如果它们是一致的,你能预计在它们的执行计划中有什么不同吗?

  3、如果这些执行计划一致,是什么使得这些查询不同?

  4、能做些什么事情来改善成本(cost)?

  第一个问题的答案是“是”,它们的查询结果集是一致的;第二个问题的答案是“不能”,因为相同的步骤是连接表;第三个问题的答案需要处理输入的数量或涉及的编码。

  在这个例子中关键词“自然连接(natural join)”,“join on”,“左/右 外连接(right/left outer join)”的使用是怎么回事,如果你懂得什么是自然连接(仍然连接两个表,但是涉及到的列名是相同的),看起来使用第二个查询不是更容易了吗?

  下面展示的是验证第二个问题的答案。

  查询1的执行计划

查询1的执行计划

  查询2的执行计划

  Oracle性能调整与优化查询2的执行计划
 
  至于最后一个问题的答案,效率高的SQL对不同的人可能意思不一样,在本例中,使用一个视图怎么样?这样与最初的查询在成本上有何不同,或有其他需要考虑的事情吗?

  假设我有一个名叫cost_example的视图,创建语句如下:


create or replace view cost_example
as
select department_id, department_name, region_name
from departments natural join locations
natural join countries natural join regions;

  让我们在视图中查看一条记录


SQL> select department_id, department_name, region_name
2  from cost_example
3  where department_id=70;
DEPARTMENT_ID DEPARTMENT_NAME                REGION_NAME
————- —————————— ————
70 Public Relations               Europe

  输出三列或字段,它们能够被改动吗?如果可以,为什么?如果不可以,为什么不可以?

  我们假设现在用Asia代替REGION_NAME的值Europe


SQL> update cost_example
2  set region_name = ‘Asia’
3  where region_name = ‘Europe’;
set region_name = ‘Asia’
*
ERROR at line 2:
ORA-01779: cannot modify a column which maps to a non key-preserved table

  DEPARTMENT_NAME字段的值能被修改吗?

SQL> update cost_example
2  set department_name = ‘PR’
3  where department_name = ‘Public Relations’;
1  row updated.

  为什么在视图中的记录能被更新的原因是departments表是一个关键保护表(它的主键DEPARTMENT_ID用于视图的创建了)。

  这个例子的要点是:仅仅因为你获得了低成本并不意味着你就不能再为查询优化做其他的事情了,使用单一连接结构适用于开发者,视图适用于用户。

  小结

  本文的主要观点是:

  ·使用绑定变量

  ·使用效率高的SQL

  ·使用编码标准

  ·创建适当的视图

  这些步骤没有哪个在执行或实现起来特别困难,因为程序员常常使用”tableA.column_name = tableB.column_name”的格式来连接,转移到使用自然连接节约相当多的输入,加上受益于关键列名相配(在子表中的外键列与父表中的主键有相同的列名),如展示的那样,某些量度可能没有大的影响,但是当当作为一个整体时,每一个小的都对改善性能有帮助,在第3部分中,我们将查看更多的例子。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

相关推荐