数 据 库 设 计 经 验 谈

2016-01-29 18:06 2 1 收藏

数 据 库 设 计 经 验 谈,数 据 库 设 计 经 验 谈

【 tulaoshi.com - ASP 】

  数据库模型的设计是否合理会极大影响系统的使用性能。笔者依据多年来设计和使用数据库的经验,提出以下一些设
计原则,供同仁们参考。

  慎用游标(Cursor)

  游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操
作。而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等待甚至死机,笔者在某市“住
房公积金管理系统”进行日终账户滚积数计息处理时,对一个10万个账户的游标处理时导致程序进入了一个无限期的等待
(后经测算需48小时才能完成)(硬件环境:Alpha/4000 128MB RAM ,SCO Unix ,Sybase 11.0)。经修改程序并改用UPDATE
语句后,该处理过程得以在20分钟之内完成。示例如下:

  Declare Mycursor cursor for select count—no from COUNT  

  Open Mycursor

  Fetch Mycursor into @vcount—no

  While (@@sqlstatus=0)

  Begin

  If @vcount—no=′ ′ 条件1

操作1

  If @vcount—no=′ ′ 条件2

操作2

...

  Fetch Mycursor into @vcount—no

  End

    ...

  改为

  Update COUNT set 操作1 for 条件1

  Update COUNT set 操作2 for 条件2

...

  在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临时表定义游标进行操作,这样,可使
性能得到明显提高。笔者在某地市“电信收费系统”数据库后台程序设计中,对一个表(3万行中符合条件的30多行数据)
进行游标操作(硬件环境:PC服务器,PⅡ266 64MB RAM ,Windows NT4.0 MS SQL Server 6.5)。

  示例如下:

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

    ( 字段1

     字段2

      ... )

  Insert into #tmp select * from TOTAL where 条件

  Declare Mycursor cursor for select * from #tmp /*对临时表定义游标*/

    ...

  索引(Index)的使用技巧

  创建索引一般有两个目的:维护被索引列的惟一性和提供快速访问表中数据的策略。大型数据库有两种索引,即簇索
引和非簇索引,一个没有簇索引的表是按堆结构存储数据,所有的数据均添加在表的尾部;而建立了簇索引的表,其数据
在物理上会按照簇索引键的顺序存储,一个表只允许有一个簇索引,因此,根据B树结构,可以理解添加任何一种索引均能
提高按索引列查询的速度,但与此同时会降低插入、更新、删除操作的性能,尤其是当填充因子(Fill Factor)较大时。
所以对索引较多的表进行频繁的插入、更新、删除操作时,建表和索引时应设置较小的填充因子,以便在各数据页中留下
较多的自由空间,减少页分割及重新组织的工作。

  数据的一致性和完整性

  为了保证数据库的一致性和完整性,设计人员往往会设计过多的表间关联(Relation),尽可能地降低数据冗余。表
间关联是一种强制性措施,建立后,对父表(Parent Table)和子表(Child Table)的插入、更新、删除操作均要占用系统
的开销,另外,最好不要用Identify 属性字段作为主键与子表关联。如果数据冗余低,数据的完整性容易得到保证,但增
加了表间连接查询的操作。为了提高系统的响应时间,合理的数据冗余也是必要的。使用规则(Rule)和约束(Check)来
防止系统操作人员误输入造成数据的错误是,设计人员的另一种常用手段,但是,不必要的规则和约束也会占用系统的不
必要开销,需要注意的是,约束对数据的有效性验证要比规则快。所有这些,设计人员在设计阶段应根据系统操作的类
型、频度加以均衡考虑。

  事务的陷阱

  事务是在一次性完成的一组操作。虽然这些操作是单个的操作,SQL Server能够保证这组操作要么全部都完成,要么
一点儿都不做。正是大型数据库的这一特性,使得数据的完整性得到了极大的保证。

  众所周知,SQL Server为每个独立的SQL语句都提供了隐含的事务控制,使得每个DML的数据操作得以完整提交或回
滚,但是SQL Server还提供了显式事务控制语句,如:

  BEGIN TRANSACTION 开始一个事务

  COMMIT TRANSACTION 提交一个事务

  ROLLBACK TRANSACTION 回滚一个事务

  事务可以嵌套,可以通过全局变量@@trancount检索到连接的事务处理嵌套层次。要特别注意的是,每个显示或隐含的
事物开始都使得该变量加1,每个事务的提交使该变量减1,每个事务的回滚都会使得该变量置0,而只有当该变量为0时的
事务提交(最后一个提交语句时),才把物理数据写入磁盘。

  数据类型的选择

  数据类型的合理选择对于数据库的性能和操作具有很大的影响,有关这方面的书籍也有不少的阐述,笔者这里主要

来源:http://www.tulaoshi.com/n/20160129/1504378.html

延伸阅读
随着我国市场经济改革的不断深入及加入WTO的日益临近,邮政面临市场竞争的压力越来越大,只有提高邮政的服务水平才能在市场竞争中取得领先地位。而体现服务水平的重要标志之一就是受理用户对邮件查询的处理。在手工作业时,一笔查询业务从用户提交到查询完成往往要一到两周时间,而综合网的建设为改变这种状况提供了非常有利的平台。 目前...
非常偏门的技巧,很少人会需要限制数据库的记录,但还是列出来给大家参考。假如数据库中只允许用户输入3个记录,那么我们可以在Table1的BeforeInsert事件里加入判断语句: procedure TForm1.Table1BeforeInsert(DataSet: TDataSet);beginIF Table1.RecNo =3 thenbeginmessagedlg(记录只能输入三个,mtinformation,[mbok],0);abort;en...
教育孩子的四种暗示法 对儿童影响最大的暗示就是体态手势、表情。如果孩子爱说话,大人噘噘嘴;孩子做小动作,家长招招手;孩子打瞌睡,老师敲敲桌子等,都能帮助孩子克服缺点。暗示,是无声的教育,是“润物细无声”的教育。下面4种情景暗示能在你教育孩子的时候有所帮助。 1、眼神暗示 吃过晚饭,爸爸给东东讲故...
Microsoft公司提供了统一的数据访问接口ActiveX Data Object,简称ADO。但实际应用编程中,访问不同的数据库,如Access、SQL Server或VFP,会存在一些“细微”差别,常常有这样的情况,用ADO对象访问某一数据库的程序都调试通过了,但用同样的程序访问其他数据库就存在这样或那样的问题,反之也一样。这种差别就笔者来看好像没什么意义,...
标签: SQLServer
  数据库设计经验谈 数据库模型的设计是否合理会极大影响系统的使用性能。笔者依据多年来设计和使用数据库的经验,提出以下一些设计原则,供同仁们参考。 慎用游标(Cursor) 游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作。而对于多表和大表中定义的游标(大的数据集...

经验教程

656

收藏

13
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部