sql笔记

文章介绍了优化OracleSQL查询的策略,包括使用大写字母、选择有效的表名顺序、调整WHERE子句顺序、避免使用*、用EXISTS替换DISTINCT和IN、利用索引以及使用>=等,以提升查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.SQL语句尽量用大写的;
    因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。

2.选择最有效率的表名顺序
    oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表
    将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表。
    如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表
    是指那个被其他表所引用的表。

3.WHERE子句中的连接顺序
    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他
    WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
    
4.SELECT子句中避免使用 * 
    ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字
    典完成的, 这意味着将耗费更多的时间

5.用EXISTS替换DISTINCT
    当SQL包含一对多表查询时,避免在SELECT子句中使用DISTINCT,一般用EXIST替换,EXISTS
    查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果
    
    SELECT DISTINCT USER_ID,BILL_ID FROM USER_TAB1 D,USER_TAB2 E 
    WHERE D.USER_ID= E.USER_ID;
    
    SELECT USER_ID,BILL_ID FROM USER_TAB1 D WHERE EXISTS(SELECT 1 
        FROM USER_TAB2 E WHERE E.USER_ID= D.USER_ID); 
        
6.用EXISTS替代IN、用NOT EXISTS替代 NOT IN:?0?2

    在基于基础表的查询中经常需要对另一个表进行联接。在这种情况下, 使用EXISTS(或NOT
    EXISTS)通常将提高查询的效率。在子查询中,NOT IN子句将执行一个内部的排序和合并。无
    论在哪种情况下,NOT IN都是最低效的(要对子查询中的表执行了一个全表遍历)。所以尽量将
    NOT IN改写成外连接(Outer Joins)或NOT EXISTS。
    
7.用>=替代>
    SELECT * FROM TEMP WHERE ID >=4;
    SELECT * FROM TEMP WHERE ID >3;
    区别:前者将直接跳到第一个ID等于4的记录而后者将首先定位到ID=3的记录并且向前扫
    描到第一个ID大于3的记录。
    
8.WHERE子句尽量走索引
    某些SELECT 语句中的WHERE子句不使用索引
    '!='与 is not null 不走索引。索引只能告诉我们什么存在于表中, 而不能告诉你什么不在表中。
    '||'是字符连接函数。就象其他函数那样, 停用了索引。
    '+'是数学函数。和其他数学函数一样, 停用了索引。
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值