2 设计技巧
2.1 分类拆分数据量大的表
对于经常使用的表(如某些参数表或代码对照表),由于其使用频率很高,要尽量减少表中的记录数量。
2.2 索引设计
在索引设计中,索引字段应挑选重复值较少的字段;在对建有复合索引的字段进行检索时,应注意按照复合索引字段
建立的顺序进行。
2.3 数据操作的优化
2.4 数据库参数的调整
数据库参数的调整是一个经验不断积累的过程,应由有经验的系统管理员完成。
2.5 必要的工具
2.6 避免长事务。
2.7 通俗地理解三个范式
通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就
必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):
第一范式:1NF 是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF 是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF 是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运
行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式
,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。
基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是
最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间
2.8 提高数据库运行效率的办法
在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:
(1) 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。
(2) 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面。
(3) 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,
以该表主键 PK 的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分
割该表,将原来的一个表分解为两个表。
(4) 对数据库管理系统 DBMS 进行系统优化,即优化各种系统参数,如缓冲区个数。
(5) 在使用面向数据的 SQL 语言进行程序设计时,尽量采取优化算法。
总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时
下功夫。
3 大数量性能优化设计
数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化
3.1 数据库自身的优化
3.1.1 增加次数据文件,设置文件自动增长(粗略数据分区)
➢ 增加次数据文件
从 SQL SERVER 2005 开始,数据库不默认生成 NDF 数据文件,一般情况下有一个主数据文件(MDF)就够了,但是有
些大型的数据库,由于信息很多,而且查询频繁,所以为了提高查询速度,可以把一些表或者一些表中的部分记录分开存储
在不同的数据文件里
由于 CPU 和内存的速度远大于硬盘的读写速度,所以可以把不同的数据文件放在不同的物理硬盘里,这样执行查询
的时候,就可以让多个硬盘同时进行查询,以充分利用 CPU 和内存的性能,提高查询速度。在这里详细介绍一下其写入的
原理,数据文件(MDF、NDF)和日志文件(LDF)的写入方式是不一样的:
数据文件:SQL Server 按照同一个文件组里面的所有文件现有空闲空间的大小,按这个比例把新的数据分布到所有有
空间的数据文件里,如果有三个数据文件 A.MDF,B.NDF,C.NDF,空闲大小分别为 200mb,100mb,和 50mb,那么写入一个
70mb 的东西,他就会向 ABC 三个文件中一次写入 40、20、10 的数据,如果某个日志文件已满,就不会向其写入
日志文件:日志文件是按照顺序写入的,一个写满,才会写入另外一个
由上可见,如果能增加其数据文件 NDF,有利于大数据量的查询速度,但是增加日志文件却没什么用处。
➢ 设置文件自动增长(大数据量,小数据量无需设置)
在 SQL Server 2005 中,默认 MDF 文件初始大小为 5MB,自增为 1MB,不限增长,LDF 初始为 1MB,增长为 10%,限制文
件增长到一定的数目,一般设计中,使用 SQL 自带的设计即可,但是大型数据库设计中,最好亲自去设计其增长和初始大小,
如果初始值太小,那么很快数据库就会写满,如果写满,在进行插入会是什么情况呢?当数据文件写满,进行某些操作时,
SQL Server 会让操作等待,直到文件自动增长结束了,原先的那个操作才能继续进行。如果自增长用了很长时间,原先的
操作会等不及就超时取消了(一般默认的阈值是 15 秒),不但这个操作会回滚,文件自动增长也会被取消。也就是说,这一
次文件没有得到任何增大,增长的时间根据自动增长的大小确定的,如果太小,可能一次操作需要连续几次增长才能满足,
如果太大,就需要等待很长时间,所以设置自动增长要注意一下几点:
1)要设置成按固定大小增长,而不能按比例。这样就能避免一次增长太多或者太少所带来的不必要的麻烦。建议对比
较小的数据库,设置一次增长 50 MB 到 100 MB。对大的数据库,设置一次增长 100 MB 到 200 MB。
2)要定期监测各个数据文件的使用情况,尽量保证每个文件剩余的空间一样大,或者是期望的比例。
3)设置文件最大值,以免 SQL Server 文件自增长用尽磁盘空间,影响操作系统。
4)发生自增长后,要及时检查新的数据文件空间分配情况。避免 SQL Server 总是往个别文件写数据。
因此,对于一个比较繁忙的数据库,推荐的设置是开启数据库自动增长选项,以防数据库空间用尽导致应用程序失败,
但是要严格避免自动增长的发生。同时,尽量不要使用自动收缩功能。
➢ 数据和日志文件分开存放在不同磁盘上
数据文件和日志文件的操作会产生大量的 I/O。在可能的条件下,日志文件应该存放在一个与数据和索引所在的数据
文件不同的硬盘上以分散 I/O,同时还有利于数据库的灾难恢复。