在oracle sql优化中看到了“sql 语句用大写的 ;因为 oracle 总是先解析 sql 语句,把小写的字母转换成大写的再执行”这样一条规则。有些疑惑。
oracle在执行一条sql语句的时候会先编译这条sql语句。
    这里有一个疑问是,oracle编译sql语句编译成了什么呢?是否就类似于java的编译把.java文件编译成了.class文件,也就是编译成了oracle自己能识别的语言?如果是这样的话,那与sql的大小写还有关系么?还有如果java程序处理字符串s,需要这个s都是大写的,都会用s.toUpperCase(),先把字符串统一转换为大写,而不会先检查字符串中是否都是有小写字符,有才转换。如果先检查字符串,速度就会更慢了吧?
    所以oracle优化sql中需要sql语句是大写的说法原理到底是怎样的呢?

解决方案 »

  1.   

    刚才做了一下执行计划,搜索一个表中的一个字段,这个字段上没有索引,全表扫描。记录数2958186,最终也选择了2958186行数据。
    单纯的select语句,没有where条件
    全部小写的情况下执行了3次执行时间分别是  00: 01: 46.09,00: 01: 38.07和00: 01: 44.00
    全部大写的情况下执行了3次执行时间分别是  00: 01: 58.00,00: 01: 42.05和00: 01: 43.00从实验结果上看也不能肯定sql语句大写会提高执行速度。
      

  2.   

    看来楼主很有钻研精神嘛,好,很好,非常好,非常特别的好。楼主你看得那篇帖子就是垃圾帖,所有情况都没有经过帖子发布者的测试,都是从其他地方粘贴拷贝过来的。有一半的规则都是狗p。如果楼主对优化真的有兴趣的话给你推荐两本书:expert one on one oracle 、effective oracle by design,都是thomas kyte写的。只有了解oracle的运作机制才能相对正确作出判断,只有实践才能检验判断的正确性。网上的很多规则都是历史遗留的,要么是适合oracle的早期而不是当前版本,要么是由于老dba们对oracle的理解不够深刻得出的似是而非的结论。当然其中也有很多正确的,不过良莠不齐还是远离为好。现在说说你当前的问题,如果sql全部要大写那只有一种原因:统一sql的编码规格,减少sql硬分析举个例子,select * from test1; SELECT * from test1; SELECT * from TEST1;这三个语句oracle要进行硬分析三次而不是一次;更进一步最好项目组能使用同样的sql做同样的事,而不是不同的sql做同样的事。和大小写相关的另一件事就是最好表名都用大写,如果你使用create table "Test1" ...建立了一个表(可能你使用其他工具比如PowerDesigner,他会自动生成类似的语句),那么你必须写select * from "Test1"来访问,而不能使用select * from Test或者select * from TEST或者其他任何不加引号的方式来访问。因为oracle 会先把Test转换为TEST到系统字典表中去查询看这个表是否存在,但是系统字典表中记录的是"Test"而不是TEST,所以oracle会告诉你ORA-00942: 表或视图不存在。但是不要以为select * from test1和select * from TEST1会使用同一个的执行计划,不是的它们使用的不是同一个执行计划,而是oracle进行两次硬分析得到的两个不同的执行计划(我这里说的不同是指持有不同的引用,用java来说就是!= 但是可能 equals)。其实你自己已经通过实践找到问题了,我这里罗嗦了。
      

  3.   

    谢谢fenixshadow 
    学到了很多啊!^_^
      

  4.   

    学习了,不过还是有疑问,SQL语句全部大写,是在Oracle中才这样,还是在其它的数据库中如:MySql等也这样么?