数 据 库 设 计 经 验 谈

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

  慎用游标(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时的
事务提交(最后一个提交语句时),才把物理数据写入磁盘。

  数据类型的选择

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

  1. Identify字段不要作为表的主键与其它表关联,这将会影响到该表的数据迁移。

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

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

时间: 2024-10-25 23:52:37

数 据 库 设 计 经 验 谈的相关文章

在Linux 下 访 问MS SQL Server 数 据 库(转载)

server 宁 波 保 税 区 官 委 会 计 算 中 心 董 保 华 ---- Linux 作 为 一 个 免 费 的Unix 类 操 作 系 统, 以 其 开 放 性 源 代 码. 多 任 务.X window 等 特 点 为 众 多 的 用 户 所 采 用, 并 有 很 多 企 业 采 用Linux 来 作 为 其 内 部 网 的 全 功 能 服 务 器(WWW,FTP,Email.DNS). 企 业 的 内 部 网 不 仅 要 提 供 文 本 信 息 的 访 问, 还 要 能 提 供

利 用 ISAPI 实 现 向 数 据 库 中 添 加 记 录 (一)

本 文 介 绍 了 用 HTML(Hypertext Makeup Language) 编 写 界 面. 编 写 ISAPI(Internet Server Application Programming Interface) 交 互 程 序 以 实 现 向 用 Microsoft SQL Server 建 立 的 数 据 库 中 添 加 记 录 的 方 法. 1. 前 言 Microsoft SQL Server 是 一 种 可 伸 缩 的. 高 性 能 的 关 系 型 数 据 库 管 理 系

《需求设计:构建用户想要和需要的产品》——第2章 设 计 体 系2.1 为什么应该建立设计体系

第2章 设 计 体 系 第1章说过,要想做工程化的设计,就必须有一套设计体系.那么本章我们就来看看能不能为IT软件的开发工作构建出一套具有工程学水准的设计体系,并且看看我们是否值得去构建这样的体系.本章分为三个部分.2.1节从下至上检视整个设计体系,以解释我们为什么应该建立该体系.接下来的2.2节-2.7节,用从上至下的方式来观察这套体系,使大家对设计之中的信息流动情况有所了解.把这套体系中的所有部件都展示出来之后,笔者会在2.8节之中回到本章开头所提出的那个问题上面.最后的2.9节是对本章所做

利 用 ISAPI 实 现 向 数 据 库 中 添 加 记 录 (二)

2. 数 据 库 表 的 建 立 结 构 化 查 询 语 言 SQL(Structural Query Language) 是 关 系 数 据 库 系 统 的 一 种 高 级 语 言, 它 是 在 七 十 年 代 末 由 IBM 公 司 的 San Jose 研 究 实 验 室 开 发 的, 现 巳 被 许 多 关 系 型 数 据 库 管 理 系 统 所 采 用, 并 被 美 国 国 家 标 准 局 认 定 为 一 种 工 业 标 准 的 关 系 数 据 库 查 询 语 言. 它 具 有 强 大

ultisim 数字电路-求交通灯控制器ms文件,数电课设,Multisim仿真

问题描述 求交通灯控制器ms文件,数电课设,Multisim仿真 要求: 1.东西方向为主干道,南北方向为副干道: 2._主干道通行40秒后,若副干道无车,仍主干道通行,否则转换:_ 4.换向时要有4秒的黄灯期: 5._南北通行时间为20秒,到时间则转换,若未到时,但是南北方向已经无车,也要转换_. 6.用数码管显示计时.能够附加各部分的解释说明就更好了!!大神们,帮帮忙吧!!急求,望找不到问题所在或者直接提示我上网搜的各位不要吐槽

应用-数 据 库 技 术 及 应 用

问题描述 数 据 库 技 术 及 应 用 1.设计一个学生--课程的数据库,包含下列表关系: 学生关系(学号,姓名,性别,年龄,所在系) 课程关系(课程号,课程名,,学分) 选修关系(学号,课程号,成绩) (1)试用E-R图描述这个数据库,要求在图中表示联系的类型(1:1,1:N,M:N):并且指出每个表关系的键码.注:一个学生可以选修多门课,一门课可由多个学生选修,学生选课后有成绩. (2)用SQL语句定义上述表关系结构 2.现有关系模式:教务(学号,课程号,成绩,教师姓名,教师年龄,教师办公

备 份 sql2000 数 据 库 源 文 件

问题描述 eclipsetomcatsql2000的环境想学习一下sql2000数据库源文件的备份下面一段代码怎么修改才能实现将sql2000数据库源文件(dbps_Data和dbps_Log)备份到C:呢?java类(Backup.java)publicclassBackupextendsActionSupport{publicStringexecute()throwsException{Runtimer=Runtime.getRuntime();r.exec("cmd/cbackupdata

ASP实现多语言支持

纲 要 :让 我 们 设 想 你 使 用 Active Server Pages 设 计 了 一 个 成 功 的 站 点 , 而 你 的 客 户 纷 纷 要 求 将 此 站 点 国 际 化 以 提 供 多 种 语 言 版 本 .这 时 候 你 该 怎 么 办?请 看 本 文. 正 文 :   一 . 介 绍   让 我 们 设 想 你 使 用 Active Server Pages 设 计 了 一 个 成 功 的 站 点 , 而 你 的 客 户 纷 纷 要 求 将 此 站 点 国 际 化 以 提

浅谈Android Studio JNI生成so库

1.新建Android studio工程 2.新建class:AppKey.java.主要为了保存密钥 代码块 package com...adminapp.lib.utils.jni; /** * Created by seven on 16/9/8. */ public class AppKey { static { System.loadLibrary("AppKey"); } public static native String WechatId(); public stat