数据库优化,小温谈数据库优化--数据设计篇

三大范式:
  1. 第一范式:指表中不含任何重复数组.
  2. 第二范式:在满足第一范式的情况下,该表的其他字段都依赖主键存在.
  3. 第三范式:表中所有非主键列均不能依赖于任意其他非主键列.
字段数据类型设计原则:
1.选择能够用来满足列需求的最小数据类型
2.尽可能使用定长数据类型,而不是变长数据类型
数据表设计要诀:
  1. 适当进行冗余,把一些需要计算字段增加到表里.
  2. 最好使用非空字段,然后添加默认值.
为什么不要设计过多的变长类型的数据呢?
1.对于 SQl Server 为说,变长类型的数据,在更新的时候,如果长度比以前的大,会进行页拆分。会对查询性能造成严重的影响。会增加查询时,O/I 的花费 (Cost) 页分隔越多,查询时,O/I 的开销就越大。对于变长的字段来说,有可能,这个字符的内容,存储在不同的位置。这个字段的内容,存储在不同的位置。存储在不同的页中, 它们之间有指针来关联。
所以就,这种情况会造成查询时,磁头来回寻址,定位。可能你查一条记录,磁头找这条记录的这个变长字段的内容,都要去好几个页里找,才能完整的找到。这样,就造成了很大个 O/I 开销,降低了查询性能。从物理上来说,文件本来就经常容易产生碎片。再加上变长类型的页拆分。
页拆分是这样产生的:
比如:
有一个变长类型的字段 Content: nvarchar(512).
你添加一条记录,给 Content 的值是 N'ABC'
那么,存储的时候,直接就存储 N'ABC' 了。
当你下次 Update 这条记录的 Content 字段时,给的值是 N'ABCDEF'
那么 就会发生页拆分。DEF 对被存储在其它页。因为有可能上一次分配的数据页已经存储了其他行的数据对吧,对,512 ,只是用来限制这个字段的长度。并不与页拆分有关系。记录的物理顺序,与你 INSERT 的顺序是一致。你 INSERT 了 N条,然后再去修改 第一条,这时候可能不在同一个页了.
以上结论就是把变长字段的内容加大,就会造成页拆分了。也就 是说可变长类型是把一页填满,再填另一,影响比较大的是,每次insert的时候会增加分配数据页得次数
当然有可能造成一行数据保存在2个数据页里.但是,同样,不但页拆分对增加查询时的 O/I 开销,字符不必要的太长,也会增加 O/I 开销。
3. 字段大小对表总大小有影响
4. 可变长类型是有长度限制的
以上内容是第一篇,请大家多多发表意见!
Tags:  如何优化数据库 数据库的优化 数据库优化策略 数据库查询优化 数据库优化

延伸阅读

最新评论

发表评论