当前位置:Gxlcms > 数据库问题 > 分布式数据库系统

分布式数据库系统

时间:2021-07-01 10:21:17 帮助过:9人阅读

将基本的业务逻辑封装在存储过程中,可以避免在应用程序层写大量的代码(在应用程序中通过字符串插入太长的SQL语句影响效率,并且维护困难)
在站点一类的应用系统中,SQL注入式漏洞一直是难以全然杜绝的漏洞。假设仅仅通过存储过程来訪问数据库,可以大大降低这类安全性问题。
需求变更。表的结构必须要改变。使用存储过程,仅仅要參数不变,我们就仅仅须要改动对应的存储过程。而不须要改动应用程序的代码。
为提高效率。使部分字段冗余;为提高效率,使用冗余表(拆分表);
使用存储过程。便于在项目后期或者执行中集中优化系统性能。


问题一:存储过程编译后。将作为数据库的全局对象保存,太多的存储过程将占用大量的数据库server的内存。
问题二:在存储过程中实现大量的逻辑,将使大量的运算在数据库server上完毕,而不是在应用server上完毕。当訪问量非常大的时候。会大大消耗数据库server的CPU占用率。


每一个存储过程内的代码前后必须加上SET NOCOUNT ON 和SET NOCOUNT OFF。




5 数据库设计规范



5.1 数据完整性规范(编码期)



1、为便于在程序的编码期查错,能够在设计数据库的时候尽可能多的加上约束(check)。如,整型的字段的取值范围等,经常为field>0。


2、同理,尽可能地在开发期间使用触发器来验证数据的完整性。


3、假设字段之间存在冗余,应该编写触发器来管理冗余的字段
3、在开发阶段保存完整的主键、外键和唯一索引的约束。
4、原则:编码期间,数据完整性优先于性能。在保障系统正确执行的前提下尽可能的提高效率。


6 数据库优化



6.1 数据库性能优化规范



1、在执行阶段删除不必要的约束(check)。
2、尽量不要使用触发器
3、尽量保留主键约束
4、适当删除外键,以提高性能
5、在执行期间,通过分析系统的訪问量。创建索引来优化性能
6、分析每一个表可能的数据增长量,定义自己主动拆分表规则。将大表进行拆分来提高性能。
7、预先考虑数据清理规则:在什么情况下删除数据库中的旧数据,以此来提高性能。
8、制定数据库备份和灾难恢复计划。
9、为效率考虑,能够在系统測试阶段适当添加冗余字段,或者冗余表。
10、分页的记录输出必须通过存储过程来实现。不能使用API游标来分页,这样能够提高分页的效率。

6.2 拆分表演示样例



案例:站点有200万用户,有非常多模块环绕用户提供服务。
     为提高效率,每一个表最多仅仅保存与用户有关的10万记录,200万条记录拆分到20个表中。编号为1-10万的用户将记录保存到表一。100001-200000编号的记录保存到表二,以此类推。


建立一个拆分信息表,表中保存了哪些表是经过拆分的。拆分到什么程度,拆分规则是什么。


当插入记录的时候。首先推断插入这条记录的用户的ID。存储过程依据ID的范围,自己主动把表插入到对应的拆分表中去。
当依照条件查询。存储过程自己主动连接全部的拆分表,丛中筛选出记录。(普通情况下:同类型的查询远远大于依照条件的全体查询)

6.3 冗余字段建立演示样例



案例:留言本表中,要保存用户的ID作为外键。

通常。通过连接留言表和用户表来得知是哪个用户公布了留言。
为提高效率,在留言本表中增建username的字段。

插入记录的时候。同一时候保存用户ID和username。这样。当查询时。就不必连接两个表,使效率大大提高。
可是,当用户改动username时,要吗更新其它表中的username。要吗忽略这样的username不一致的影响。怎样处理取决于username在模块中的重要程度。




6.4 冗余表建立演示样例



案例:实用户表和分组表,两个表之间是多对多的关系。建立一个用户与组的关系表来实现这样的关系。
用户表中有百万条记录。组表中几千条记录。假设每一个用户都属于多个组的化。关联表中将存在几百万条记录。
如今将用户表和关联表进行拆分。拆分规则为用户的ID范围。

当查询某用户的组时。效率大大提高。可是当查询某组下的用户时,须要关联全部的拆分表,效率非常低。
为提高效率,建立一个冗余的用户和组的关系表,这个关系表中保存第一个关系表中统一的内容,可是拆分规则为组ID的范围。这样,当查询组中的用户时,丛第二个关系表中查询。效率大大提高。


6.5 存储过程中分页方案



方案一:
1、首先统计得到符合条件的记录数
2、定义表变量:表变量的第一个字段为自增长类型。第二个字段为记录集中的唯一值字段(通常是主键)
3、使用insert () select 语句将符合条件的记录的唯一值字段保存在表变量中。


4、使用where ID in (select ID From 表变量 WHERE ……) 的方法从表两边中读出须要的唯一值字段。


方案二:
1、首先统计符合条件的记录数。并依据页大小计算页数
2、假设读取第一页,直接使用TOP子句读取
3、假设页数在前一半:
结果集1:SELECT TOP  CurPage*PageSize  Fields FROM Table ORDER BY ID ASC
结果集2:SELECT TOP PageSize * FROM (结果集1) ORDER BY ID DESC
终于结果:SELECT * FROM (结果集2) ORDER BY ID ASC
4、假设页数在后一半:
结果集1:SELECT TOP (PageCount-CurPage)*PageSize Fields FROM Table ORDER BY ID DESC
终于结果:SELECT TOP PageSize * FROM Table ORDER BY ID ASC





声明:

 博客转载地址:blog.csdn.net/longronglin/article/details/5469463.

分布式数据库系统

标签:附加   独立性   策略   hardware   username   from   sql   漏洞   独立   

人气教程排行