一些SQL技巧

1. Primary Key

  字段的长度尽量小,能用small integer 就不要用 integer

2. Data Type

  文字字段若长度固定,能用char,nchar 就不要用varchar, nvarchar 如: 身份证号码, 手机号

3.

  设计字段时,若其值可有可无,最好也给一个默认值,并设成[不允许为NULL] (一般字段默认为[允许为NULL]). 因为SQL SERVER 在存放和查询有NULL的数据表时,会花费额外的运算动作。

4. INDEX

  • 在foreign key字段建立索引,即使是很少被JOIN的数据表也依然
  • 替常被查询或排序的字段建立索引。如:常被当做WHERE子句条件的字段
  • 索引不宜建立在长度过长(如地址)或重复性高的字段(如性别)或使用率低的字段(浪费空间)
  • 索引不宜建立过多(影响DML性能,尤其是对于OLTP系统)
  • 数据量小时不必建立索引

5.

  避免在WHERE子句中对字段使用函数。如:查询10万条数据,相当于故交10万次函数,绝对的性能杀手

6.

  UNION性能低于UNION ALL,因为会有去重计算。所以在可以用UNION ALL的情况下尽量不适用UNION

7.

  AND 与 OR: 在AND运算中,只要有一个条件用到索引,即可大幅提升查询速度。

          在OR运算中,只有所有条件都可用到索引,才能是用索引提升查询速度。

8. in & exists

  很多人都说能用exists就别用in,这样可以大幅提升查询速度。其实并不是所有情况都是exists效率高,经过试验,查询速度也依赖于前后两个表的数据量大小。

  • 如果两个表大小相当,则in和exists的查询速度差别不大
  • 如表A(小表)和表B(大表) 则:前(表)大用exists,前(表)小用in
      •   select * from A where cc in (select cc from B)  效率低,用到了A表上cc列的索引
      •       select * from A where exists(select cc from B where B.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 A.cc = B.cc)  效率低,用到了A表上cc的索引
  • not in 和 not exists
    •   如果查询语句使用了not in,那么内外表都会进行全表扫描,没用用到索引, 而not exists 的子查询依然恁够用到表上的索引,所以无论哪个表大,用not exists都比not in 快

9. NOT IN 和 EXCEPT

  • except 会去重复, NOT IN 不会去重复
  • except 用于比较的列是所有列,除非写子查询限制列; NOT IN 没有这种情况
  • tb2中有NULL值,except返回结果,NOT IN 不返回任何值
  • tb1中有NULL值,except可以查询到这个null值,NOT IN不会查询到这个null值。

(如果有兴趣可以验证以上结果,本人用实例已经验证过,这里就只跟大家share这些conclusions.

select cc from tb1
except
select cc from tb2;

select cc from tb1 where cc not in (select cc from tb2);

一些SQL技巧,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。