SQL语句的优化:
1、 如果需要控制查询的记录条数,可以使用dao.query()的方法来实现,不要在sql语句中采取rownum<n的方式;
2、 数据库索引的建立:目前的系统中很多表没有建立必要的索引,导致查询消耗了很长时间。随着系统的不断运行,数据量不断加大,效率会越来越低。请建立必要的数据库索引,并注意:
◆避免对索引字段进行计算操作
◆避免在索引字段上使用not,<>,!=:对不等于操作符的处理会造成全表扫描,可以用“<” or “>”代替,不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。不用“<>”或者“!=”操作符。Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。
◆避免在索引列上使用IS NULL和IS NOT NULL
◆避免在索引列上出现数据类型转换
sql语句优化方式◆避免在索引字段上使用函数;如果需要,可以建立函数索引
◆避免建立索引的列中使用空值。
◆对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。
    3、部分UPDATE、SELECT 语句 写得很复杂(经常嵌套多级子查询),可以考虑适当拆成几步进行处理;
    4、update:同一个表的修改在一个过程里出现好几十次,如:update table1set col1=...where col2=...;update table1set col1=...where col2=.........,象这类脚本其实可以很简单就整合在一个UPDATE语句来完成。
    5、在可以使用UNION ALL的语句里,使用了UNIONUNION 因为会将各查询子集的记录做比较,故比起UNION ALL ,通常速度都会慢上许多。一般来说,如果使用UNION ALL能满足要求的话,务必使用UNION ALL。还有一种情况大家可能会忽略掉,就是虽然要求几个子集的并集需要过滤掉重复记录,但由于脚本的特殊性,不可能存在重复记录,这时
便应该使用UNION ALL
        6、表名排序:选择最有效率的表名顺序(只在基于规则的优化器中有效)ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
        7、对Where 语句的法则:
◆在WHERE 语句中,尽量避免对索引字段进行计算操作;
◆避免在WHERE子句中使用innot  inor 或者having;可以使用 exist not exist代替 innot in;可以使用表链接代替 existHaving可以用where代替,如果无法代替可以分两步处理。
◆不要以字符格式声明数字,要以数字格式声明字符值
ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
LikeLIKE 操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%5400%’ 这种查询不会引用索引,而LIKE ‘X5400%’则会引用范围索引
◆避免在索引列上使用计算:WHERE子句中,如果索引列是函数的一部分,优化器将不使用索引而使用全表扫描。
             低效:
SELECT … FROM DEPT WHERE SAL * 12 > 25000;
            高效:SELECT … FROM DEPT WHERE SAL > 25000/12;
                 
        8、对Select语句的法则:在应用程序、包和过程中限制使用select * from table这种方
式。ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
        9、排序:避免使用耗费资源的操作,带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BYSQL语句会启动SQL引擎 执行,耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序。
        10Order ByORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序;ORDER BY中所有的列必须定义为非空。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。