Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Database/JDBC/SQL/JDO/Hibernate » Oracle  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 【原创】Oracle客户端编程
jeremy





发贴: 23
积分: 20
于 2004-01-31 13:52 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
最近对新员工培训,整理Oracle客户端编程资料。
其中删除了有关公司内部资料的信息,不过不影响内容。

版主:能否加1分,想下载几本Oracle的书。谢谢!

一、绑定变量
使用绑定变量可以减少Oracle对语句的硬分析,加快语句的执行。

样例程序:VB

没有使用绑定变量执行1000次 Insert 命令耗时 8.36 秒
使用绑定变量执行1000次 Insert 命令耗时 2.56 秒
使用绑定变量的速度为不使用绑定变量的 30%,如果在大量用户集中执行此命令的情况下,效果更加明显。

为什么使用绑定变量可以加快数据?
1、减少了Oracle对语句的分析。Oracle可以在缓存中直接使用上次已分析过的语句。
2、不需要对语句执行查询路径分析。直接使用上次的查询路径。

开发中注意事项:
1、编码变得烦琐,但为了以后没有人找你麻烦,还是烦琐一些好!
2、RDO 使用 rdoQuery 对象,ADO使用 Command 对象。Java 使用 PreparedStatement。各种开发语言均有此类对象。

二、正确使用索引
  语句   执行时间
错误  SELECT *
  FROM xxy x
  WHERE x.编号=1000000019   1.515秒
错误  SELECT *
  FROM xxy x
  WHERE upper(X.编号)='1000000019' 1.64秒
正确  SELECT *
  FROM xxy x
  WHERE x.编号='1000000019'   0.062秒
    正确的语句与错误语句有何不同之处?

此例说明Oracle的隐式转换数据功能可能误导开发员,使开发员写出蹩脚的SQL语句。

开发中注意事项:
1、 正确使用索引字段,并要注意查询语句中的关键字类型与数据库中索引字段的字段类型一致。
2、 不要在索引上使用函数。
3、 尽可能不使用Like、Is Null语句,而使用 >、< 代替。

三、 FROM语句
语句执行时间
错误  SELECT *
  FROM d_fs fs,djb dj,xxyb xxy
  WHERE dj.方式=fs.方式
   AND fs.类型='什么类型'
   AND dj.编号=xxy.编号  24.844秒
正确  SELECT *
  FROM djb dj,xxyb xxy,d_fs fs
  WHERE dj.方式=fs.方式
   AND fs.类型='什么类型'
   AND dj.编号=xxy.编号  4.453秒

Oracle的优化方式分为基于成本和基于规则的优化方式。
在使用基于规则的优化方案的时候,应将记录数小的表写在FROM语句的后面。

四、 EXISTS、NOT EXISTS
尽量不使用 In、Not In,而使用 Exists、Not Exists代替。
  语句  执行时间
错误  SELECT *
  FROM cfxb xd
  WHERE xd.日期 BETWEEN SYSDATE-30 AND SYSDATE
   AND xd.编号 NOT IN (SELECT zb.编号
   FROM cfzb zb)  3.281秒
正确  SELECT *
  FROM cfxxb xd
  WHERE xd.日期 BETWEEN SYSDATE-30 AND SYSDATE
   AND NOT EXISTS (SELECT 1
   FROM cfzb zb
   WHERE zb.编号=xd.编号)  0.172秒

刚开始使用Exists语句不如In语句直观,大家习惯一下就可以了。

五、 其它事项
a) 在select、insert语句中不允许使用 * 代替所有字段,应明确指定字段名称。
b) SQL语句中使用到多个表,应在select语句中明确使用表别名引用表中的字段。




flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923