查询优化
- 避免全表扫描,首先应该考虑where及order by涉及的列上建立索引。(当然不是所有列都适合建立索引,索引也不是越多越好)
- 有些查询会让数据库引擎放弃索引从而进行全表扫描,所以对这些操作应该进行替换
- 对于联系的数值,用betwwen代替in
- 在where子句中使用参数会导致全表扫描。
select id form t where num =@num - 避免在where子句中对字段进行表达式操作会导致全表扫描。
select id from t where num/2=100,改为 select id from t where num=100*2 - 避免在where子句中对字段进行函数操作会导致全表扫描。
select id from t where substring(name,1,3)='abc' //name以abc开头的id
改为 select id from t where name like 'abc%' - 不要在where子句中的"="左边进行函数、算术运算或其它表达式运算,否则系统可能无法正确使用索引。
- 在使用索引字段作为条件时,如果改索引是复合索引,那么必须使用该索引中的第一个字段作为条件时才能保证系统使用该索引,否则不会使用该索引,并且尽可能让字段顺序与索引顺序相一致。
操作符 | 使用位置 | 替换 | 案例 | |
---|---|---|---|---|
is null | where后 | 为字段设置默认值,0或者‘’,然后改用>或<来操作 | ||
!= | where | 放弃使用 | ||
<> | where | 放弃使用 | ||
or | where | union all | select id from t where num =10 union all select id form t where num =20 | |
in | where | exists | ||
not in | where | not exists | ||
like '%abc% | where | 通配符一边确定值为X和Y的话可以拆分成两个like 'Xabc%" 和like 'Yabc%"进行联表查询 |
- 一个表最多只有一个聚簇索引(clustered),尽可能不更新 clustered索引数据类,因为clustered索引数据类的顺序就是表记录的物理存储顺序一旦该值改变将导致整个表记录的顺序的调整,耗费资源很大,所以选择clustered索引也要考虑不常变动的列。
- 尽量使用数字类型字段。因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,对于数字型而言只需要比较一次就够了。
- 尽可能使用varchar/nvarchar代替char/vchar,因为变长字段存储空间小,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高。当然,如果该字段不是用作查询,那么在存储信息时char除了占用空间多外,但是其添加效率快,因为不需要动态根据内容调整占用空间。
- 不要使用select * from t,用具体字段代替* .
-----------------待更新