数据库系统优化:业务逻辑设计优化

当我们优化一个系统时,有时发现一种情况就是自己修改SQL,索引以及分区是不能解决性能问题的。这时你要考虑业务逻辑优化和表设计的重构。这两点的确和设计结合的很紧密。

业务逻辑优化

结合实际,我们先谈谈业务逻辑优化。

案例一:

我们的系统一个文档模块,客户点击时很慢,通过性能分析,是点击是去查询数据库,这时系统是通过Hibernate来两步处理:

1,计算该类型的文档数量总数。

2,显示最新文档的前20篇文档。

这时显示第二步的时间是很快的,只取20条记录,但是计算该类型的所有总数很慢。系统的这时的输入是很大的(计算该类型的全部文档,可能有几万篇数据),输出就一条总数。这时因为业务逻辑复杂,即使建立索引,分区等等速度也是无法提高,因为不能真正做到索引覆盖和分区消除。

客户是点一下要等十几秒是不能容忍的,这时可能输入数据量很大下,数据库很可能采用的是hash联结,而且并发用户一大,数据库服务器压力很大。

这时常规的优化方法是没有效果的。这时我们也发现,客户其实对以前比较老的数据是不关心的,一般只是对近期的数据比较感兴趣,所有我们就在查询时默认设定半年的时间,然后在时间上设定聚集索引。并默认在此时间上排序,使其使用合并联结,减少输入数据量,结果速度有明显的提升。

案例二:

我们在优化一个客户系统时,碰到一种情况,在客户的一选择功能时,客户点击一下选择相关数据,这时页面要要几分钟才能出来,客户很不满意,这时修改sql和索引都没有办法,他的输入的数据量也很大,和上面一下也要计算总数和取最新前几条数据。

这时我们在查询是关联了人员,通过调查,发现客户只对和自己相关的数据感兴趣。也只是查询自己相关的数据。所以这时在sql语句里增加用户id这条限制,同时在增加userid的索引,这样一来,速度就大大提高。

总接:

当然以上两个案例,是从输入入手,减少输入和输出的数据量,主要优化业务逻辑,达到优化系统。当然有些情况要和客户确认和说服他们,有时他们不一定都认可,这时要说明这样做的目的,相信他们也会理解。

表设计优化

表设计,在我们开发系统时已经确定,好的设计的确能大大提高性能,我们在优化系统时,碰到一个比较麻烦的问题。

原文: 数据库重构(一):字段合并

这条sql是判断5个维度,一个用户id, 一个机构id,一个岗位id, 还有级别判断和是否公共。sql语句里有5个”or“组成查询,表数据一大就表扫描,性能很差,但业务要求和系统要求这样判断。即使在表中这五个字段都建索引,速度也不会快。太多"OR"了,SQL Server 查询分析器无法优化。

这时由于设计时: 用户id,机构id,岗位id为3个只有一个有数据。所以将这3个字段合并,较少"Or"语句,让数据库能使用索引。

总结

表设计是优化是让sql语句能使用到索引,或者增加冗余字段减少其输入和输出数据,或者减少查询数据(如计算静态表),典型的如索引视图,数据仓库等。

时间: 2024-11-02 04:54:11

数据库系统优化:业务逻辑设计优化的相关文章

《解剖PetShop》之五:PetShop之业务逻辑层设计_自学过程

五 PetShop之业务逻辑层设计 业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,我们也将业务逻辑层称为领域层.例如Martin Fowler在<Patterns of Enterprise Application Architecture>一书中,将整个架构分为三个主要的层:表示层.领域层和数据源层.作为领

大数据的商业化:从数据、模型到业务逻辑

1.市面上关于大数据的各种定义太多,不一而足,此处写在前面的,我先定义一下: 大数据,表示极多的数据,而其来源,凡能通过技术手段触达的都算. 2.商业化,即如何使数据产生价值,这个价值并不来源于数据本身,而是来源于数据的被需求方(被需求方可以是甲方也可以是乙方)是否能够在其业务范围内被满足具备一定价值的数据. 数据商业化的核心非数据,而是数据模型. 3. 数据模型:建立满足需要的业务导向的数据模型(算法),输入需要的可触达来源的获取的数据,并输出相应的结果. 比如用户画像分析.数据结构化等等都算

《解剖PetShop》系列之五:PetShop之业务逻辑层设计

业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分.它的关注点主要集中在业务规则的制定.业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,我们也将业务逻辑层称为领域层.例如Martin Fowler在<Patterns of Enterprise Application Architecture>一书中,将整个架构分为三个主要的层:表示层.领域层和数据源层.作为领域驱动设计的先驱Eric Evans

架构设计-业务逻辑层简述

    业务逻辑层是专门处理软件业务需求的一层,处于数据库之上,服务层之下,完成一些列对Domain Object的CRUD,作为一组微服务提供给服务层来组织在暴露给表现层,如库存检查,用法合法性检查,订单创建.    业务逻辑层包含领域对象模型,领域实体,业务规则,验证规则,业务流程.1:领域对象模型为系统结构描述,包含实体功能描述,实体之间的关系.领域模型处于天生的复杂性:2:领域实体:业务层是一些操作业务对象(BO)的处理.业务对象包含数据和行为,是一个完整的业务对象.其不同于上节架构设计

大数据-关于数据库分表后的 业务逻辑应该是怎么样,求解答!

问题描述 关于数据库分表后的 业务逻辑应该是怎么样,求解答! 数据库有一张表 数据太多 导致查询非常慢,分表后 业务逻辑是怎样的: 假如把一张表分成三张表,那么在项目里面写查询的时候是要连续查三张表么? 解决方案 如果是你的表太宽也就是字段太多可以考虑分表,按业务逻辑拆分如果是数据量太大导致查询缓慢,建议不分表.因为只是查询的话必然会对全表做一次扫描,起不到提高查询效率的作用.可以考虑以下几种方式:1. 通过索引的方式,使用索引字段查询2. 在表上建立分区,查询时指定分区条件3. 如果是关联查询

关于业务逻辑 方法如何设计的问题

问题描述 请教个问题业务逻辑如何来划分...比如说我有个订单表还有订单明细表是不是业务逻辑应该与具体表无关直接就是订单的逻辑另外颗粒度细到那个程度.比如说我模块分两大模块:卖车和修车卖车里面分为订单和进销存.修车分为卖配件和维修..我的业务逻辑是分为两部分:卖车和修车呢还是分的更细些.....请各位高手指点. 解决方案 解决方案二:具体表是用来存放数据的,不是逻辑根据表设计,正好相反,你的表应该根据业务需求而规划.否则表结构定死了,许多业务实现起来很困难,或者根本无法实现.解决方案三:那车辆进销

[架构设计] 什么是业务逻辑

讨论设计时,专业词汇满天飞,每个人的技术背景.工作经验上的不同都会导致在理解上存在着差异.无论是SEI的定义.OMG UML的定义.还有各路大神的定义,都有从不同视角带来的差异.准备后面关注这些不同定义,摊开来大家一起来讨论. 关于'业务逻辑', 国内国外争论了很多年了(这篇在07年就说没有清晰的定义),其中几个比较详细的讨论见附录(一定要看评论).我总结主要分为两类: 一类是逻辑处理论,一类是数据操作论. 逻辑处理论 先看前者,这一类观点,核心是强调逻辑. 细说业务逻辑中,作者将业务逻辑分别做

ASP.NET2.0数据操作之创建业务逻辑层

asp.net|创建|数据 导言 本教程的第一节所描述的数据访问层(Data Access Layer,以下简称为DAL)已经清晰地将表示逻辑与数据访问逻辑区分开了.不过,即使DAL将数据访问的细节从表示层中分离出来了,可它却不能处理任何的业务规则.比如说,我们可能不希望产品表中那些被标记为"停用"的产品的"分类编号"或"供应商编号"被更新:我们还可能需要应用一些资历规则,比如说我们都不希望被比自己的资历还要浅的人管理.另外一个比较常见的情况就是

大数据量下的数据库查询与插入如何优化? (整理)

数据库经常要做一些查询与插入,但是如果查询和插入的数据量过大的时候就会引发数据库性能问题,降低数据库工作效率.因此性能调优是大家在工作中都能够预见的问题,大到世界五百强的核心系统,小到超市的库存系统,几乎都会有要调优的时候.面对形形色色的系统,林林总总的需求,调优的手段也是丰富多彩. 1.尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询 2.避免频繁创建和删除临时表,以减少系统表资源的消耗. 3.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理. 4.建立高效的索引