Oracle关于sql的优化

  1. 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。
    原因:Oracle在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。
   而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。
   NOT EXISTS 比 NOT IN 效率稍高。但具体在选择IN或EXIST操作时,
   要根据主子表数据量大小来具体考虑。
   SELECT * FROM SP_MATTERS WHERE UUID IN (SELECT UUID FROM SP_MATTERS)
   SELECT * FROM SP_MATTERS WHERE EXISTS (SELECT UUID FROM SP_MATTERS WHERE UUID = SP_MATTERS.UUID)
  1. 不用"<>“或者”!=“操作符, 对于不等于操作符会造成全表扫描, 应该用”>" OR “<” 代替
  2. is null 或者 is not null 条件会造成全表扫描, 解决方案可以为该列设置非空索引,就可以利用其它条件判断
  3. 在like后面出现通配符 “%” 或者 “_” 时, 索引会失效, 造成全表扫描
  4. 对于有连接的列"||",最后一个连接列索引无效, 尽量避免连接, 可以分开连接或者使用不作用在列上的函数替代
  5. 如果索引不是基于函数的,那么当在where子句中对索引列使用函数时, 索引不再起作用
  6. 对数据类型不同的列进行比较时,会使索引失效
  7. ‘>=’ 比 ‘>‘的执行效率高, 原因: ‘>=’ 会通过索引快速定位等于项, 然后再向下扫描, 选出大于项, 而’>’ 直接走全表扫描
  8. union和union all的区别union会对结果进行筛选, 消除重复, 数据量大的情况下可能会引起磁盘排序, 如果不删除重复记录应该使用union all
  9. oracle从下到上多个查询条件时, 应该将过滤量最大的条件放在where子句的末尾
  10. oracle 从右到左处理from后面的多个表时, 应该将数据量最少的表放在最后
  11. order by 语句中的非索引列会降低性能, 可以将排序列添加索引
  12. 当前sql连接多个表时, 使用表的别名, 并将之作为每列的前缀, 这样可以减少解析时间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值