SQL 性能优化几条建议
经验显示,SQL Server 性能的最大改进得益于逻辑的数据库设计、索引设计和查询设计方面。反过来说,最大的性能问题常常是由其中这些相同方面中的不足引起的。其实 SQL 优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充份利用索引,减少表扫描的 I/O 次数,尽量避免表搜索的发生
1. 数据库设计:
1.1 数字编号做主键的,采用系统提供的自增字段。
1.2 所有数据库设置为提供默认值并非空(避免在数据获取层进行数据检测,减少抛异常的可能性)
1.3 适当使用冗余
1.4 适当使用索引
1.5 某些长度固定的字段,可以用Char(N)尽量少用VarChar(N)
1.6 适当使用视图,可以考虑索引视图
1.7 日志和正式数据文件放在不同的硬盘上
2. 数据查询
2.1 只查询需要的字段
2.2 确定查询中不会出现相同项或者出现相同项关系不大,用union all 不用union
2.3 如果使用了IN或者OR等时发现查询没有走索引,使用显示申明指定索引: SELECT * FROM PersonMember (INDEX = IX_Title) WHERE processid IN ('男','女')
SELECT 字段名表
FROM 表名表
WITH (INDEX(索引名))
WHERE 查询条件
2.4 多用Between替代in
2.5 非必要不用事务
2.6 谨慎使用or,会使索引失效
2.7 没有必要时不要用DISTINCT和ORDER BY
2.8 不要在事物内使用select INTO 创建临时表
2.9 少用临时表,尽量用结果集和Table类性的变量来代替它,Table 类型的变量比临时表好
2.10 应尽量避免在 WHERE 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描
2.11 Where子句说明查询的条件,直接决定查询的性能。因此在where 子句的书写及应用中要多加注意。书写where 子句时尽量避免使用不兼容的数据类型,避免对where 子句中的条件参数使用其他的数学操作符,尽可能的把操作转化到式子的左边,这样可以有效的利用已有的索引技术。对于where字句中的多个选择条件,要选取结果集小的先执行
3. 索引的建立
3.1 常用查询字段建索引
3.2 建立索引的字段需要分散性要大
3.3 合理控制查找的字段,最好只选择索引字段
3.4 组合索引要注意索引的组合的先后顺序
3.5 需要定期更新索引
3.6 ① 聚族索引(Clustered Index):聚族索引的数据页按物理有序储存,占用空间小。选择策略是,被用于Where子句的列:包括范围查询、模糊查询或高度重复的列(连续磁盘扫 描);被用于连接Join操作的列;被用于Order by和Group by子句的列。聚族索引不利于插入*作,另外没有必要用主键建聚族索引。
② 非聚族索引(Nonclustered Index):与聚族索引相比,占用空间大,而且效率低。选择策略是,被用于Where子句的列:包括范围查询、模糊查询(在没有聚族索引时)、主键或外 键列、点(指针类)或小范围(返回的结果域小于整表数据的20%)查询;被用于连接Join*作的列、主键列(范围查询);被用于Order by和Group by子句的列;需要被覆盖的列。对只读表建多个非聚族索引有利。索引也有其弊端,一是创建索引要耗费时间,二是索引要占有大量磁盘空间,三是增加了维护代 价(在修改带索引的数据列时索引会减缓修改速度)。那么,在哪种情况下不建索引呢?对于小表(数据小于5页)、小到中表(不直接访问单行数据或结果集不用 排序)、单值域(返回值密集)、索引列值太长(大于20bitys)、容易变化的列、高度重复的列、Null值列,对没有被用于Where子语句和 Join查询的列都不能建索引。另外,对主要用于数据录入的,尽可能少建索引。当然,也要防止建立无效索引,当Where语句中多于5个条件时,维护索引 的开销大于索引的效益,这时,建立临时表存储有关数据更有效。
3.7 不能用 null 作索引,任何包含 null 值的列都将不会被包含在索引中