精通数据库系列之入门-本领篇4[MSSQL防范]
本文“精通数据库系列之入门-本领篇4[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
大型数据库计划原则
作者:思考 整理:南海
一个好的数据库产品不等于就有一个好的利用系统,假如不能计划一个公道的数据库模子,不但会增添客户端和服务器段程序的编程和保护的难度,并且将会影响系统实际运行的性能.普通来说,在一个MIS系统解析、计划、测试和试运行阶段,因为数据量较小,计划人员和测试人员常常只注意到功效的实现,而很难注意到性能的柔弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要耗费更多的人力物力,而整个系统也不可避免的形成了一个打补钉工程.笔者根据多年来计划和利用数据库的经验,提出以下一些计划原则,供同仁们参考.
命名的标准
差别的数据库产品对对象的命名有差别的要求,因此,数据库中的各种对象的命名、后台程序的代码编写应采取大小写敏感的情势,各种对象命名长度不要超越30个字符,这样便于利用系统适应差别的数据库.
游标(Cursor)的慎用
游标供应了对特定调集合逐行扫描的手段,普通利用游标逐行遍历数据,按照取出的数据差别条件举行差别的操作.特别对多表和大表定义的游标(大的数据调集)循环很简单使程序进入一个冗长的等特乃至死机,笔者在某市《住房公积金管理系统》举行日终帐户滚积数计息处理时,对一个10万个帐户的游标处理招致程序进入了一个无期限的等特(后经测算需48个小时才能完成)(硬件环境:Alpha/4000 128Mram ,Sco Unix,Sybase 11.0),后按照差别的条件改成用差别的UPDATE语句得以在二非常钟之内完成.
示比方下:
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服务器,PII266 64Mram ,NT4.0 Ms Sqlserver 6.5). 示比方下:
Create #tmp /* 定义暂时表 */
( 字段1
字段2
...
)
Insert into #tmp select * from TOTAL where 条件 /* TOTAL中3万行 符合条件只有几十行 */
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时的事件提交(最后一个提交语句时),这时才把物理数据写入磁盘.
数据库性能调整
在计算机硬件配置和网络计划肯定的情形下,影响到利用系统性能的因素不外乎为数据库性能和客户端程序计划.而大大都数据库计划员采取两步法举行数据库计划:首先举行逻辑计划,此后举行物理计划.数据库逻辑计划去除了全部冗余数据,提高了数据吞吐速度,保证了数据的完好性,清楚地表达数据元素之间的关系.而关于多表之间的关联查询(特别是大数据表)时,其性能将会降低,同时也提高了客 户端程序的编程难度,因此,物理计划需折衷考虑,按照业务法则,肯定对关联表的数据量大小、数据项的拜候频度,对此类数据表频繁的关联查询应得当提高数据冗余计划.
数据范例的挑选
数据范例的公道挑选关于数据库的性能和操作具有很大的影响,有关这方面的书籍也有不少的阐述,这里主要介绍几点经验.
Identify字段不要作为表的主键与别的表关联,这将会影响到该表的数据迁移.
Text 和Image字段属指针型数据,主要用来存放二进制大型对象(BLOB).这类数据的操作相比别的数据范例较慢,因此要避开利用.
日期型字段的长处是有众多的日期函数支持,因此,在日期的大小对比、加减操作上非常简单.但是,在按照日期作为条件的查询操作也要用函数,相比别的数据范例速度上就慢很多,因为用函数作为查询的条件时,服务器无法用先进的性能战略来优化查询而只能举行表扫描遍历每行.
比方:要从DATA_TAB1中(此中有一个名为DATE的日期字段)查询1998年的全部记录.
以上是“精通数据库系列之入门-本领篇4[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |