精通数据库系列之入门

精通数据库系列之入门,第1张

精通数据库系列之入门,第2张

好的数据库产品不代表好的应用系统。如果不能设计出合理的数据库模型,不仅会增加客户端和服务器程序的编程和维护难度,还会影响系统的实际性能。一般来说,在一个MIS系统的分析、设计、测试和试运行阶段,由于数据量较小,设计人员和测试人员往往只关注功能的实现,而很难注意到性能的弱点。当系统投入实际运行一段时间后,发现系统性能在下降。这时候就需要更多的人力物力去考虑提升系统性能,整个系统不可避免的形成了一个打补丁的工程。笔者根据多年设计和使用数据库的经验,提出以下设计准则,供同仁参考。


命名规范

不同的数据库产品对命名对象有不同的要求。因此,数据库中各种对象的命名和后台程序的代码编写要区分大小写,各种对象的命名长度不超过30个字符,便于应用系统适应不同的数据库。

小心使用光标

光标提供了一种逐行扫描特定集合的方法。一般用游标逐行遍历数据,根据检索到的数据的不同情况进行不同的操作。特别是多表、大表定义的游标(大数据集)循环,很容易导致程序进入长时间等待甚至崩溃。笔者在某市住房公积金管理系统中进行日累计账户利息计算时,一个10万账户的游标处理导致程序进入无限等待(计算后需要48小时才能完成)(硬件环境:Alpha/4000 128Mram,Sco Unix,Sybase 11.0),然后根据不同的条件,使用不同的UPDATE语句,二十分钟即可完成。

例子如下:

为select count_no from COUNT声明Mycursor游标


打开我的光标

将Mycursor提取到@vcount_no

While (@@sqlstatus=0)

开始

If @vcount_no= ' '条件1

操作1

If @vcount_no= ' '条件2

操作2

。。。

将Mycursor提取到@vcount_no

目标

。。。

。。。

代替

更新条件1的计数集操作1

更新条件2的计数集操作2

。。。

。。。

在某些情况下,有时必须使用游标。这时还可以考虑将符合条件的数据行转移到临时表中,然后在临时表上定义游标,这样可以明显提高实时性能。笔者在某市“电信收费系统”数据库的后台程序设计中,对一张表(3万行中30行以上合格数据)进行光标操作(硬件环境:PC服务器,PII 266 64 M RAM,NT 4.0 ms SQL Server 6.5)。例子如下:

Create #tmp /*定义一个临时表*/

(字段1

2字段
。。。

)

into # tmp select * from total where condition/*总共3万行符合条件,只有几十行*/

为select * from #tmp声明Mycursor游标

/*为临时表定义游标*/

。。。


使用索引的原则

通常,创建索引有两个目的:维护索引列的属性,以及提供快速访问表中数据的策略。大型数据库中有两种索引,即聚簇索引和非聚簇索引。没有聚簇索引的表以堆结构存储数据,所有数据都添加在表的末尾。对于具有聚集索引的表,其数据按照聚集索引键的顺序存储,并且一个表只允许有一个聚集索引。因此,根据B树结构,可以理解为添加任何索引都可以提高索引列的查询速度,但会降低插入、更新和删除操作的性能。因此,经常插入、更新和删除索引较多的表,在创建表和索引时设置较小的填充因子,以便在每个数据页中留出更多的空闲空空间,减少页分割和重组的工作。

数据的一致性和完整性

为了保证数据库的一致性和完整性,设计人员往往会设计过多的表间关系,以尽可能减少数据的冗余。表间关联是强制性措施。建立后,插入、更新和删除父表和子表会占用系统的开销。此外,不要使用Identify属性字段作为与子表关联的主键。如果数据冗余度低,数据的完整性很容易得到保证,但是增加了表间连接查询的操作。为了提高系统的响应时间,合理的数据冗余也是必要的。利用规则和约束来防止系统操作员错误输入导致的数据错误是设计人员的另一种常用手段。但是,不必要的规则和约束也会占用系统不必要的开销。应该注意,约束比规则更快地验证数据的有效性。所有这些都应由设计者在设计阶段根据系统运行的类型和频率进行平衡。

交易陷阱

事务是一次完成的一组操作。尽管这些操作是单个操作,但SQL Server可以保证这组操作要么完全完成,要么根本不执行。正是大型数据库的这一特点确保了数据的完整性。


众所周知,SQL Server为每个独立的SQL语句提供了隐式的事务控制,使得每个DML的数据操作可以完全提交或回滚,但是SQL Server也提供了显式的事务控制语句
-begin transaction启动事务
-commit transaction提交事务。

- ROLLBACK TRANSACTION回滚事务。

-事务可以嵌套,关联事务的嵌套层次结构可以通过全局变量@@trancount检索。

需要特别注意的,也是程序员非常容易犯错误的是,每一个显示或者隐含的东西都是从这个变量加1开始,每一个事务提交都是从这个变量减1开始,每一个事务回滚都是从这个变量设置0开始。只有当此变量为0时,事务才会提交(最后一条提交语句),然后物理数据才会写入磁盘。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 精通数据库系列之入门

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情