`
lexinquan
  • 浏览: 45902 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

数据库设计经验之--数据库应用检视

阅读更多
1、数据库索引创建检查。包括:(a)索引字段应为差异性较大、长度较小的类型,枚举类型字段不要建索引;(b)防止创建包含过多字段的复合索引;(c)索引字段的值不要出现过多空值或重复值。

2、数据库索引使用检查。包括:(a)对表的数据操作(尤其是对大表的查询)是否用到了合适的索引;(b)对于插入型的实时表,保证新记录插入到索引顺序的最后面;(c)如果有复合索引,要按建立索引字段的顺序(取前面部分或全部字段)做查询。

3、代码SQL按需读写检查。仅返回需要的数据,减少磁盘及网络IO。例如:大表访问中不要用 select * ,要指定具体的字段,返回结果集时要加上合适的 where 限定条件,减小返回结果集的大小。

4、表映射类检查。包括:(a)对表映射类的公共方法,必须抽象出公共基类和相关接口,便于日后对公共方法和辅助方法的添加和修订;(b)对表映射类中的数据字段的Get和Set方法,必须匹配该值与其对应的数据表字段值的对应关系,如:字段值是否为NULL;字段值是否为空字符;(c)将表映射类对象转换为XML字符串的方法,或将结果集转化为表映射类对象的方法,需要区分字段值是否被初始化,是否为NULL值或空字符,反之亦然(例如:数据库中,Integer类型数值可能为NULL,VARCHAR类型数据值可能为NULL或””)。

5、关键模块禁止使用自动代码。使用自动代码必须注意的问题包括:(a)不要使用自动代码进行批量查询(查询字段、查询条件必须手工编写);(b)不要使用自动代码进行事务处理和批处理;(c)原则上自动代码仅允许提供明确按主键定位的方法;(d)原则上仅允许在非关键的信息维护表的处理中使用自动代码(例如:客户信息的维护模块,数据表字段多,业务处理代码简单,与数据表字段一一对应)。

6、连接表查询优化检查。包括:(a)连接表数量不宜超过2个;(b)子查询结果较小的表应作为连接查询主表;(c)超过两个的连接查询,若数据量巨大,不宜使用SQL或存储过程直接查询,可通过业务处理代码实现子查询结果的合并;

7、批处理SQL操作优化检查。包括:(a)对于批量的重复性的数据表操作,考虑首先查询出批量SQL所需使用的结果集,然后使用AddBatch()添加操作SQL,最后ExecuteBatch();
例如:(Select 1条记录 + Insert 1条记录)*100次,应优化为:Select 100条记录 + AddBatch(Insert 1条记录) *100+ExecuteBatch();(b)对于批量数据转移操作,如当前表转历史表,考虑使用Insert into …Select from …来实现。

8、潜在超大事务检查。包括:(a)优化事务中的操作,尽量避免大事务的产生;(b)把大事务拆分成若干小事务分别处理;(c)尽量使用共享锁,注意及时提交事务,释放锁和事务日志;(d)设置数据库配置参数,当事务执行时间超过阀值时,自动回滚事务并释放锁定的资源,同时注意察看数据库系统日志中相关事件记录。

9、数据库死锁检查。减小死锁发生机率,包括:(a)用共享锁代替排它锁;(b)减小锁的粒度;(c)不同进程按同样的顺序申请资源。

10、分布事务处理检查。若业务处理的控制相对简单,则无需引入事务管理器等复杂的解决方案,可考虑采用经典的提交确认方法来解决:(a)插入一条分布式事务记录,“提交状态”为“未确定”);(b)提交子事务1;(c)提交子事务2;(d)修改“提交状态”为“已确定”。
对于提交失败的分布式事务,由逻辑代码自行判断执行回滚or重新提交;

11、日志完整性检查。包括:(a)日志应根据阅读者的不同分类,如:给业务管理人员用的用户操作日志,给系统管理员看的系统操作日志,给开发人员看的系统异常日志,等等 (b)日志的内容应比较完善能反映问题,如:时间,用户ID,系统模块ID,日志描述,错误编码,错误级别,错误描述;(c)日志的载体可分为文本日志、数据库日志,对数据库可能异常的地方应同时记录文件日志;

12、非法全局性实例变量检查。在数据库操作的代码中应:(a) 非特别需要,避免使用全局变量;(b)避免通过全局变量传递参数;(c)避免将局部变量设为全局变量;

13、静态变量检查。在数据库操作的代码中应:(a)非特别需要,避免使用过多的静态变量;(b)避免静态变量与线程并发处理相关;(c)避免公开静态变量供外部使用;

14、超大内存对象检查。包括:(a)对于大内存对象的运算程序,应该控制其线程并发数;(2)测试在最大并发量下的进程内存占用情况;(c)大内存对象可考虑存储于BLOB或CLOB字段中,存储前考虑对其进行压缩运算;(d)存储大内存对象的数据表应独立建表,将其作为相关业务数据表的子表;

15、资源未释放检查。跟踪每一处资源创建的语句,保证其都有对应的资源释放语句,防止遗漏。

16、报表及统计类程序与实时处理程序分离检查。包括:(a)对于每日、每周、每月、每季度、每半年、每年固定所需的统计报表,可制定批处理执行计划,在非繁忙时段(如凌晨)进行报表运算;(b)对于临时提交的查询报表请求,避免对其进行实时运算,可将该任务提交给批处理任务管理模块,由程序根据其优先级和等待时间等在空闲时间进行,完成批处理任务后向相关人员发送通知;(c)不允许由业务操作人员随时发起报表及统计操作,更不允许由业务操作人员随意设置查询条件进行查询、统计,而是应由程序事先做好报表及统计功能,由业务操作人员触发或在空闲时间在后台统计并生成结果文件,业务操作人员只能随时调阅生成的结果文件。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics