数据库设计规范
数据库相关的开发&优化原则
- 为每个数据表创建聚集索引,以及其它必要的索引(根据业务需求识别经常要查询的字段)
- 数据表结构的定义应该优先考虑降低SQL查询的复杂性
- 优先使用唯一索引来保证字段值的不重复性(用异常来识别重复插入)
- 可适当增加冗余字段降低查询的复杂度
- WHERE过滤条件要符合SARG原则
- 使用参数化查询,重用执行计划
- 共用数据库连接,避免反复打开。
- 尽量使用有序GUID,避免直接使用 newid()
- 禁止使用触发器,禁止使用存储过程,禁止使用CLR SP
- 避免在数据库中执行较复杂的业务逻辑(SP),或者复杂的数据转换、计算
- 尽量降低SQL语句的复杂性,可适当返回 粗粒度结果让 应用程序代码来处理
缺少索引的危害
- I/O -> 内存 -> CPU , 压力全部变大。
- 由于需要扫描大量记录,导致语句运行很慢。
- 容易产生大量的锁,阻塞其它进程,以及被阻塞。
- 由于持有过多的锁,出现死锁的机率也会变大。
缺少索引的改进建议
- 为表指定主键
- 为外键字段创建索引
- 为一些重要的查询条件创建索引
- 关注执行计划中高成本的:扫描,联接,分组,排序。
创建索引的注意事项
- 索引不是越多越好,尤其要避免产生冗余索引。
- 只为频繁查询的参考字段创建索引。
- 创建高选择性的索引(符合条件的行数与总行数之比)。
- 索引值不得超过900字节
- 不建议创建包含索引(除非那个查询非常稳定非常重要)
冗余索引的危害
- 更新数据的SQL运行更慢,因为要维护索引。
- 浪费更多的磁盘资源。
- 耗费更多的维护成本。
SARG是什么?
SARG: Searchable Arguments
搜索参数 (SARG) 可指定精确匹配、
值的范围或由 AND 联接的两项或多项的连接,因此能够限制搜索范围。
SARG格式:
- 列 运算符 <常量或变量>
- <常量或变量> 运算符 列
SARG 运算符包括 =、>、<、>=、<=、IN、BETWEEN,
有时还包括 LIKE(在进行前缀匹配时,如 LIKE ‘Fish%')。
SARG 可以包括由 AND 联接的多个条件。
非 SARG 运算符包括: NOT运算符 、函数调用 和 字段计算表达式。
不符合SARG的改进建议
- 有函数调用的:去掉函数掉用,调整语句。
- 字段计算表达式:将字段与常量分离。
- 使用 NOT:调整业务需求,使用一个较小的范围。
- 使用 NOT:根据业务需求,拆分表。
- LIKE‘%XXX%’ :调整业务需求,改写为 LIKE ‘XXX%’