SQL优化
2015-10-22 15:14
330 查看
不要
1、不要不建立聚集索引,没有聚集索引的表一直都会是全表扫描
2、不要使用select *,不要返回任何不使用的字段
避免
1、避免表达式放在where的左边,可能无法正确使用索引
2、避免where中出现!=和<>,sql会放弃索引,进行全表扫描
3、避免where对字段进行null判断,sql会放弃索引,进行全表扫描
处理:给null列使用默认值,例如0,空字符串
4、避免使用游标,可以用while循环代替
5、避免返回大量的数据,可以使用分页
6、避免使用in和not in,sql会放弃索引,进行全表扫描
处理:可以使用exists代替,连续数据也可以用between
7、避免where 中使用 or 连接条件,sql会放弃索引,进行全表扫描
处理:
select id from table where id=1 or id 2
改为
select id from table where id=1
union all
select id from table whre id =2
8、避免模糊查询like,sql会放弃索引,进行全表扫描
9、避免使用临时表
10、避免使用游标
11、避免使用count()来执行存在性检查
处理:count()会计算所有匹配的值,改用exists当发现第一个匹配项时,就会返回结果
12、避免使用两个不同类型的列进行表连接,级别低的类型会进行转换,变成级别高的类型,转换消耗资源,转换后的索引也会失效
13、避免使用sp_开头的自定义存储过程,系统存储过程是以sp_开头的,会加大存储过程的搜索量
建议
1、在where,orderby列建立索引,如果查询比较固定,可以建立复合索引
2、使用数值字段,sql处理字符串时会逐个比较每个字符,而数值型一次比较就够了
3、使用可变长度类型代替定长类型,如nvarchar代替nchar,可变长度占用空间小,自然查询也快
其他
1、一个基于数据库的应用程序运行起来很慢时,90%的问题是出在数据访问,正确的索引会使系统性能得到质的提升
2、如果是复合索引,只有当索引的第一个字段作为条件时才会使用该索引,并且应该让条件字段与索引字段顺序尽量一致
3、SQL是根据表中的数据来进行索引优化的,当在sex字段上建立索引时,sql可能根本不会去使用这个索引
4、最好不要使用触发器,触发、执行触发器本身就是一个耗费资源的过程
5、只从单个表中检索数据,没必要使用视图,有多个表时视图才有用
执行计划
SQL语句发送给SQL Server后,查询分析器会使用数据分布统计,索引结构,元数据及其他多种信息分析可能的执行计划,最后选择最佳的执行计划。
执行计划的一些说明:
表扫描,当表没有聚集索引时会发生,只要创建或者重建聚集索引可以解决。
聚集索引扫描,本质上是表扫描,一般出现扫描字样表示没有索引或索引无效,应用中应该更多出现索引查找字样。
事件探查器SQL Server Profiler
SQL事件探查器是一个跟踪和监控SQL Server实例的图形化工具,主要用于分析和衡量在数据库服务器上执行的TSQL性能,你可以捕捉服务器实例上的每个事件,将其保存到文件或表中供以后分析。
当你的数据库遇到性能问题时,大多数时候使用SQL事件探查器就能够诊断和找出引起性能问题的背后原因了.
1、不要不建立聚集索引,没有聚集索引的表一直都会是全表扫描
2、不要使用select *,不要返回任何不使用的字段
避免
1、避免表达式放在where的左边,可能无法正确使用索引
2、避免where中出现!=和<>,sql会放弃索引,进行全表扫描
3、避免where对字段进行null判断,sql会放弃索引,进行全表扫描
处理:给null列使用默认值,例如0,空字符串
4、避免使用游标,可以用while循环代替
5、避免返回大量的数据,可以使用分页
6、避免使用in和not in,sql会放弃索引,进行全表扫描
处理:可以使用exists代替,连续数据也可以用between
7、避免where 中使用 or 连接条件,sql会放弃索引,进行全表扫描
处理:
select id from table where id=1 or id 2
改为
select id from table where id=1
union all
select id from table whre id =2
8、避免模糊查询like,sql会放弃索引,进行全表扫描
9、避免使用临时表
10、避免使用游标
11、避免使用count()来执行存在性检查
处理:count()会计算所有匹配的值,改用exists当发现第一个匹配项时,就会返回结果
12、避免使用两个不同类型的列进行表连接,级别低的类型会进行转换,变成级别高的类型,转换消耗资源,转换后的索引也会失效
13、避免使用sp_开头的自定义存储过程,系统存储过程是以sp_开头的,会加大存储过程的搜索量
建议
1、在where,orderby列建立索引,如果查询比较固定,可以建立复合索引
2、使用数值字段,sql处理字符串时会逐个比较每个字符,而数值型一次比较就够了
3、使用可变长度类型代替定长类型,如nvarchar代替nchar,可变长度占用空间小,自然查询也快
其他
1、一个基于数据库的应用程序运行起来很慢时,90%的问题是出在数据访问,正确的索引会使系统性能得到质的提升
2、如果是复合索引,只有当索引的第一个字段作为条件时才会使用该索引,并且应该让条件字段与索引字段顺序尽量一致
3、SQL是根据表中的数据来进行索引优化的,当在sex字段上建立索引时,sql可能根本不会去使用这个索引
4、最好不要使用触发器,触发、执行触发器本身就是一个耗费资源的过程
5、只从单个表中检索数据,没必要使用视图,有多个表时视图才有用
执行计划
SQL语句发送给SQL Server后,查询分析器会使用数据分布统计,索引结构,元数据及其他多种信息分析可能的执行计划,最后选择最佳的执行计划。
执行计划的一些说明:
表扫描,当表没有聚集索引时会发生,只要创建或者重建聚集索引可以解决。
聚集索引扫描,本质上是表扫描,一般出现扫描字样表示没有索引或索引无效,应用中应该更多出现索引查找字样。
事件探查器SQL Server Profiler
SQL事件探查器是一个跟踪和监控SQL Server实例的图形化工具,主要用于分析和衡量在数据库服务器上执行的TSQL性能,你可以捕捉服务器实例上的每个事件,将其保存到文件或表中供以后分析。
当你的数据库遇到性能问题时,大多数时候使用SQL事件探查器就能够诊断和找出引起性能问题的背后原因了.
相关文章推荐
- mysql 表的创建、删除、更改、和查询
- [点滴]静默安装sqlserver2008
- OCI调用oracle入门程序
- Oracle常用的OCI函数
- oracle利用分隔符,组合查询想表达的任何话
- oracle利用分隔符,组合查询想表达的任何话
- 通过SQL得到某年内每周的开始日期和结束日期
- Mysql字符集
- web开发 mysql数据库操作 之 分页技术
- sql执行顺序
- Redis命令总结
- 数据库中用sql语句进行行列转换
- Orcale 和 MySql的区别 五十点
- mongodb之查看状态的命令详解
- [MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键
- MySql常用命令总结
- MySQL/MariaDB Tips
- oracle pl/sql之sql中的case语句
- oracle日期时间型timestamp的深入理解
- oracle日期时间型timestamp的深入理解