一:索引设计建议
检查WHERE子句和连接条件列;
当一个查询提交到SQL Server时,查询优化器尝试为查询中引用的所有表查找最佳的数据访问机制。以下是它所进行的方式:
1) 优化器识别WHERE子句和连接条件中所包含的列。
2) 检查这些列上的索引。
3) 优化器通过从索引维护的统计确定子句的选择性(也就是返回多少行)评估每个索引的有效性。
4) 最终,优化器根据前面几个步骤中收集的信息,估计读取所限定的行开销最低的方法。
使用窄索引;
索引中的列尽量少。
索引使用的数据类型大。
原因是使索引变小,减少读取索引IO消耗,减少存储。
检查列的唯一性;
1) 在一个具有小范围的可能值的列(如性别)上创建索引对性能没有好处,因为查询优化器将不能使用索引有效地减少返回的行。
2) 复合索引先使用最有选择性的列将使索引行的列更有效率。
检查列的数据类型;
考虑列顺序;
复合类型列使用率大的列应在前面
考虑索引类型;
覆盖索引、索引交叉、过滤索引、索引视图、索引压缩。
非聚焦索引会引起书签查找:可以使用覆盖、交叉索引方式解决
二:碎片
重新排列索引行和页面使物理和逻辑顺序相符来解决。外部碎片可以物理重排索引的叶子页面使其遵循索引的逻辑顺序。
卸载并重建索引;使用DROP_EXISTING子句重建索引;在索引上执行ALTER INDEX REBUILD语句;在索引上执行ALTER INDEX REORGANIZE语句。
填充因子技术。
三:其它
避免不可参数化的搜索条件。
可参数化:包含条件=,>,>,=,<,<,=,between,like 'abcde%'
不可参数化:排队条件<>,!=,not exists , not in , not like in ,or , like'%abcde'
注意like前面导字符的方式,前导字符越大越好。
避免在WHERE子句上使用自述运算符。
避免在WHERE子句列上的函数。