专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 数据库设计:设计数据库的经验谈 »正文

数据库设计:设计数据库的经验谈

来源: 发布时间:星期日, 2009年1月18日 浏览:86次 评论:0
="t18">数据库设计经验谈

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

慎用游标(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 o @vcount—no

While (@@sqlstatus=0)

Begin

If @vcount—no=′ ′ 条件1

操作1

If @vcount—no=′ ′ 条件2

操作2

...

Fetch Mycursor o @vcount—no

End

 ...

改为

Update COUNT 操作1 for 条件1

Update COUNT 操作2 for 条件2

...

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

举例如下:

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

 ( 字段1

  字段2

   ... )

Insert o #tmp select * from TOTAL where 条件

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

 ...

索引(Index)使用窍门技巧

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

数据致性和完整性

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

事务陷阱

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

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

BEGIN TRANSACTION 开始个事务

COMMIT TRANSACTION 提交个事务

ROLLBACK TRANSACTION 回滚个事务

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

数据类型选择

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

1. Identy字段不要作为表主键和其它表关联这将会影响到该表数据迁移

2. Text 和Image字段属指针型数据主要用来存放 2进制大型对象(BLOB)这类数据操作相比其它数据类型较慢因此要避开使用

3. 日期型字段优点是有众多日期支持因此在日期大小比较、加减操作上非常简单但是在按照日期作为条件查询操作也要用相比其它数据类型速度上就慢许多,作为查询条件时服务器无法用先进性能策略来优化查询而只能进行表扫描遍历每行


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: