SQL语句查询优化

一、exists与in的区别

         existsin都可以实现一个目的.二者都可以用来过滤数据.

         exists,not exists一般都是与子查询一起使用.

         In可以与子查询一起使用,也可以直接in (a,b.....)

        写法不同, existswhere条件是: "...... where exists (..... where a.id=b.id)"
        --in
where条件是: " ...... where id in ( select id .... where a.id=b.id)"

 注意,一直以来认为existsin效率高的说法是不准确的。

 in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。
1、如果查询的两个表大小相当,那么用inexists差别不大。

2、如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in
例如:表
A(小表),表B(大表

第一中情况:

                select * from A where cc in (select cc from B)效率低,用到了A表上cc列的索引

                select * from A where exists(select cc from B where cc=A.cc)效率高,用到了B表上cc列的索引。
第二中情况:

                 select * from B where cc in (select cc from A)效率高,用到了B表上cc列的索引

                 select * from B where exists(select cc from A where cc=B.cc)效率低,用到了A表上cc列的索引

exist会针对子查询的表使用索引.

        in与子查询一起使用的时候,只能针对主查询使用索引.

        not exist会对主子查询都会使用索引.

         not in则不会使用任何索引

综上,无论那个表大,用not exists都比not in要快。

二、>和>=和<和<=操作符

         大于或小于操作符一般情况下是不用调整的,因为它有索引就会采用索引查找。但有的情况下可以对它进行优化

,如一个表有100万记录,一个数值型字段A30万记录的A=030万记录的A=139万记录的A=21万记录的A=3。那么执行

A>2A>=3的效果就有很大的区别了,因为A>2ORACLE会先找出为2的记录索引再进行比较,而A>=3ORACLE则直接找到A=3的记录索引。

三、Like操作符

        LIKE操作符可以应用通配符查询,里面的通配符组合可能达到几乎是任意的查询,但是如果用得不好则会产生性能上的问题,如LIKE ‘%%’ 这种查询不会引用索引,而LIKE %’则会引用范围索引。

四、OR和UNION ALL

         应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描

五、SELECT* 和SELECT 列名      

       在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。此外,在select查询中如有不必要的列,会带来额外的系统开销,特别是LOB类型的列。EXISTS 子查询是唯一允许出现SELECT* 的情况

六、WHERE书写优化

        1、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

        2、应将可以过滤掉大量数据的条件放前边

    这些是公司之中基本需要考虑的SQL优化基础,在公司中师兄师姐的指导下慢慢体会出来的,有什么不对的请路过的大神多多指教。

<和 <=  操作符

你可能感兴趣的:(SQLServer)