2.1 where条件过滤数据多的放在前面,减少产生的暂时表的数据量 2.2 在必要当条件的列上加索引,避免全表扫描
起首应考虑在 where 及 order by,不要判断=null或!=,<>,where 子句中使用 or ,in 和 not in 也要慎用,都会导致引擎放弃使用索引而举行全表扫描,索引也可以定期维护任务里重新建立索引(表上频繁发生update,delete操纵时必要重建)。 2.3 like查询也将导致全表扫描
select id from t where name like '%abc%',若要提高服从,可以考虑全文检索。 2.4 子句中使用参数,也会导致全表扫描
由于SQL只有在运行时才会解析局部变量,可以改为强制查询使用索引:select id from t with(index(索引名)) where num=@num。 2.5 尽量避免在 where 子句中对字段举行表达式操纵和函数操纵
这将导致引擎放弃使用索引而举行全表扫描6、索引列有大量数据重复时,SQL查询可能不会去利用索引,索引并不是越多越好,索引固然可以提高相应的 select 的服从,但同时也低落了 insert 及 update 的服从,由于 insert 或 update 时有可能会重建索引。 2.6 不要更新聚集索引数据列
索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会泯灭相当大的资源。 2.7 避免频繁创建和删除暂时表 2.8 尽量避免向客户端返回大数据量
若数据量过大,应该考虑相应需求是否公道。
具体实现
3.1 对查询举行优化,应尽量避免全表扫描,起首应考虑在 where 及 order by 涉及的列上建立索引 3.2 应尽量避免在 where 子句中对字段举行 null 值判断,否则将导致引擎放弃使用索引而举行全表扫描 3.3 应尽量避免在 where子句中使用!=或<>操纵符,否则将引擎放弃使用索引而举行全表扫描 3.4 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而举行全表扫描
如:
select id from t where num=10 or num=20
可以这样查询
select id from t where num=10
union all
select id from t where num=20
复制代码
3.5 in 和 not in 也要慎用,否则会导致全表扫描
如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
复制代码
3.6 下面的查询也将导致全表扫描
select id from t where name like '%abc%'
复制代码
若要提高服从,可以考虑全文检索。 3.7 如果在 where 子句中使用参数,也会导致全表扫描
由于SQL只有在运行时才会解析局部变量,但优化步调不能将访问计划的选择推迟到运行时;它必须在编译时举行选择。
然而,如果在编译时建立访问计划,变量的值照旧未知的,因而无法作为索引选择的输入项。如下面语句将举行全表扫描:
select id from t where num=@num
复制代码
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
复制代码
3.8 应尽量避免在 where 子句中对字段举行表达式操纵,这将导致引擎放弃使用索引而举行全表扫描
如:
3.21 在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF
无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。 3.22 尽量避免大事务操纵,提高体系并发能力 3.23 尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否公道