SQL慢查询原因:
- 没有索引或者没有使用到索引
- I/O吞吐量小,形成了瓶颈效应
- 没有创建计算列导致查询不优化
- 内存不足
- 网络速度慢
- 查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
- 锁或者死锁
- sp_lock,sp_who,活动的用户查看,原因是读写竞争资源
- 返回了不必要的行和列(这里其实也和索引有关,如果不必要的行和列,没有用到索引造成了全表扫描,或者是这些行和列占用了锁,才会拖慢)
- 查询语句不好,没有优化
SQL语句优化:
- 尽量避免全表扫描,首先考虑在where和order by涉及的列上建立索引
- 尽量避免在where子句中对字段进行null值判断,会导致引擎放弃使用索引而进行全表扫描
- 尽量避免在where子句中使用!= 或 <> 操作符,会导致引擎放弃使用索引而进行全表扫描
- 应尽量避免在 where 子句中使用 or 来连接条件,会导致引擎放弃使用索引而进行全表扫描
- 应尽量避免使用 in 和 not in,会导致全表扫描,能用between就不要用in
- 全模糊查询也会导致全表扫描,可以考虑全文检索
如: select id from t where name like ‘%c%‘;
- 在 where 子句中使用参数,也会导致全表扫描,可以改为强制使用索引
如: select id from t where num=@num ; 改为: select id from t with(index(索引名)) where num=@num ;
- 尽量避免在 where 子句中对字段进行表达式操作, 这将导致引擎放弃使用索引而进行全表扫描
如: select id from t where num/2=100; 可以改为: select id from t where num=100*2;
- 尽量避免在 where 子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
- 不要在 where 子句中的“=”左边进行函数. 算术运算或其他表达式运算,否则系统将可能无法正确使用索引