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

面向程序员的数据库访问性能优化法则

阅读更多

http://blog.csdn.net/yzsind/archive/2010/12/06/6059209.aspx

好文章,关键字整理一下:

 

一、数据库访问优化法则简介

 

 

从图上可以看到基本上每种设备都有两个指标:

 

从图上可以看到基本上每种设备都有两个指标:

延时(响应时间):表示硬件的突发处理能力;

带宽(吞吐量):代表硬件持续处理能力。

 

从上图可以看出,计算机系统硬件性能从高到代依次为:

CPU——Cache(L1-L2-L3)——内存——SSD硬盘——网络——硬盘

根据数据库知识,我们可以列出每种硬件主要的工作内容:

CPU及内存:缓存数据访问、比较、排序、事务检测、SQL解析、函数或逻辑运算;

网络:结果数据传输、SQL请求、远程数据库访问(dblink);

硬盘:数据访问、数据写入、日志记录、大数据量排序、大表连接。

 

根据当前计算机硬件的基本性能指标及其在数据库中主要操作内容,可以整理出如下图所示的性能基本优化法则:

根据数据库知识,我们可以列出每种硬件主要的工作内容:

CPU及内存:缓存数据访问、比较、排序、事务检测、SQL解析、函数或逻辑运算;

网络:结果数据传输、SQL请求、远程数据库访问(dblink);

硬盘:数据访问、数据写入、日志记录、大数据量排序、大表连接。

 

根据当前计算机硬件的基本性能指标及其在数据库中主要操作内容,可以整理出如下图所示的性能基本优化法则:

 
 

 

这个优化法则归纳为5个层次:

1、  减少数据访问(减少磁盘访问)

2、  返回更少数据(减少网络传输或磁盘访问)

3、  减少交互次数(减少网络传输)

4、  减少服务器CPU开销(减少CPU及内存开销)

5、  利用更多资源(增加资源)

 

 

 

 

 

 二、Oracle数据库两个基本概念
数据块(Block)
数据块是数据库中数据在磁盘中存储的最小单位,也是一次IO访问的最小单位,一个数据块通常可以存储多条记录,数据块大小是DBA在创建数据库或表空间时指定,可指定为2K、4K、8K、16K或32K字节。下图是一个Oracle数据库典型的物理结构,一个数据库可以包括多个数据文件,一个数据文件内又包含多个数据块;

 

 

ROWID
ROWID是每条记录在数据库中的唯一标识,通过ROWID可以直接定位记录到对应的文件号及数据块位置。ROWID内容包括文件号、对像号、数据块号、记录槽号,如下图所示:

 

三、数据库访问优化法则详解
1、减少数据访问
1.1、创建并使用正确的索引

 

1.2、只通过索引访问数据

有些时候,我们只是访问表中的几个字段,并且字段内容较少,我们可以为这几个字段单独建立一个组合索引,这样就可以直接只通过访问索引就能得到数据,一般索引占用的磁盘空间比表小很多,所以这种方式可以大大减少磁盘IO开销。

如:select id,name from company where type='2';

如果这个SQL经常使用,我们可以在type,id,name上创建组合索引

create index my_comb_index on company(type,id,name);

有了这个组合索引后,SQL就可以直接通过my_comb_index索引返回数据,不需要访问company表。

1.3、优化SQL执行计划

 

 

2.2、只返回需要的字段

 

3、减少交互次数

 

3.1、batch DML

 

3.2、In List

很多时候我们需要按一些ID查询数据库记录,我们可以采用一个ID一个请求发给数据库,如下所示:

for :var in ids[] do begin

  select * from mytable where id=:var;

end;

 

我们也可以做一个小的优化, 如下所示,用ID INLIST的这种方式写SQL:

select * from mytable where id in(:id1,id2,...,idn);

 

通过这样处理可以大大减少SQL请求的数量,从而提高性能。那如果有10000个ID,那是不是全部放在一条SQL里处理呢?答案肯定是否定的。首先大部份数据库都会有SQL长度和IN里个数的限制,如ORACLE的IN里就不允许超过1000个值。

另外当前数据库一般都是采用基于成本的优化规则,当IN数量达到一定值时有可能改变SQL执行计划,从索引访问变成全表访问,这将使性能急剧变化。随着SQL中IN的里面的值个数增加,SQL的执行计划会更复杂,占用的内存将会变大,这将会增加服务器CPU及内存成本

 

 

 

3.4、使用存储过程

3.5、优化业务逻辑

3.6、使用ResultSet游标处理记录

 

 

 

 

4、减少数据库服务器CPU运算

4.1、使用绑定变量

绑定变量是指SQL中对变化的值采用变量参数的形式提交,而不是在SQL中直接拼写对应的值。

非绑定变量写法:Select * from employee where id=1234567

绑定变量写法:

Select * from employee where id=?

Preparestatement.setInt(1,1234567)

 

Java中Preparestatement就是为处理绑定变量提供的对像,绑定变量有以下优点:

1、防止SQL注入

2、提高SQL可读性

3、提高SQL解析性能,不使用绑定变更我们一般称为硬解析,使用绑定变量我们称为软解析

 

4.2、合理使用排序

4.3、减少比较操作

我们SQL的业务逻辑经常会包含一些比较操作,如a=ba<b之类的操作,对于这些比较操作数据库都体现得很好,但是如果有以下操作,我们需要保持警惕:

Like模糊查询,如下所示:

a like ‘%abc%’

 

Like模糊查询对于数据库来说不是很擅长,特别是你需要模糊检查的记录有上万条以上时,性能比较糟糕,这种情况一般可以采用专用Search或者采用全文索引方案来提高性能。

 

4.4、大量复杂运算在客户端处理

 

5、利用更多的资源

 

5.1、客户端多进程并行访问

多进程并行访问是指在客户端创建多个进程(线程),每个进程建立一个与数据库的连接,然后同时向数据库提交访问请求。当数据库主机资源有空闲时,我们可以采用客户端多进程并行访问的方法来提高性能。如果数据库主机已经很忙时,采用多进程并行访问性能不会提高,反而可能会更慢。

5.2、数据并行处理

数据库并行处理是指客户端一条SQL的请求,数据库内部自动分解成多个进程并行处理

 

 

现在大部分Java框架都是通过jdbc从数据库取出数据,然后装载到一个list里再处理,list里可能是业务Object,也可能是hashmap

由于JVM内存一般都小于4G,所以不可能一次通过sql把大量数据装载到list里。为了完成功能,很多程序员喜欢采用分页的方法处理,如一次从数据库取1000条记录,通过多次循环搞定,保证不会引起JVM Out of memory问题。

当我们采用select从数据库查询数据时,数据默认并不是一条一条返回给客户端的,也不是一次全部返回客户端的,而是根据客户端fetch_size参数处理,每次只返回fetch_size条记录,当客户端游标遍历到尾部时再从服务端取数据,直到最后全部传送完成。所以如果我们要从服务端一次取大量数据时,可以加大fetch_size,这样可以减少结果数据传输的交互次数及服务器数据准备时间,提高性能。

 

 

 

3.3、设置Fetch Size

数据库访问框架一般都提供了批量提交的接口,jdbc支持batch的提交处理方法,当你一次性要往一个表中插入1000万条数据时,如果采用普通的executeUpdate处理,那么和服务器交互次数为1000万次,按每秒钟可以向数据库服务器提交10000次估算,要完成所有工作需要1000秒。如果采用批量提交模式,1000条提交一次,那么和服务器交互次数为1万次,交互次数大大减少。采用batch操作一般不会减少很多数据库服务器的物理IO,但是会大大减少客户端与服务端的交互次数,从而减少了多次发起的网络延时开销,同时也会降低数据库的CPU开销。

 

 

 

目前ORACLESQL执行计划的算法约300种,而且一直在增加,所以SQL执行计划是一个非常复杂的课题,一个普通DBA能掌握50种就很不错了,就算是资深DBA也不可能把每个执行计划的算法描述清楚。虽然有这么多种算法,但并不表示我们无法优化执行计划,因为我们常用的SQL执行计划算法也就十几个,如果一个程序员能把这十几个算法搞清楚,那就掌握了80%SQL执行计划调优知识。

 

 

2、返回更少的数据

2.1、数据分页处理

                  客户端分页

                  应用服务器分页

                  数据库SQL分页

分享到:
评论

相关推荐

    面向程序员的数据库访问性能优化法则.pdf

    面向程序员的数据库访问性能优化法则 本文面向数据库应用开发的程序员,旨在提供实用的数据库访问性能优化法则。以下是本文的要点: 一、数据库访问性能优化法则简介 为正确的优化SQL,我们需要快速定位性能瓶颈...

    面向程序员的数据库访问优化原则

    ### 面向程序员的数据库访问优化原则 #### 引言 随着信息技术的快速发展,数据库作为数据管理和存储的核心工具,在企业级应用中的地位日益凸显。然而,如何有效地提高数据库访问性能成为了众多程序员面临的挑战之一...

    面向程序员的数据库访问性能

    ### 面向程序员的数据库访问性能知识点 #### 一、引言 在现代软件开发过程中,数据库性能优化是一项至关重要的任务。对于程序员而言,掌握一定的数据库访问性能优化技巧不仅能够提升应用程序的整体性能,还能减轻...

    2021-2022收藏资料面向程序员的数据库访问性能优化法则.docx

    2021年09月16日

    ORACLE查询优化

    本文将从五个层次介绍面向程序员的数据库访问性能优化法则。 1. **减少数据访问(减少磁盘访问)** 磁盘I/O是数据库系统中的瓶颈之一,降低数据访问次数可以显著提升性能。优化策略包括: - 使用索引:合理创建和...

    oracle ch03部分

    在《OracleDBA手记3》的第三章节中,叶正盛同学聚焦于数据库性能优化与内部原理的解析,特别是针对数据库访问性能的优化法则。尽管这部分内容最初是面向程序员的,但它同样对数据库管理员(DBA)具有重要的参考价值。...

    程序员软考合订本

    数据库知识包括关系型数据库的基本概念(如ER模型、SQL语句)、数据库设计(范式理论)、事务处理、索引优化等。熟悉数据库操作和设计原理,能有效提高数据管理与查询效率。 通过学习《程序员软考合订本》中的历年...

    java面试题

    5. **面向程序员的数据库访问性能优化法则**: 数据库性能优化是提高应用程序效率的关键。可能涉及索引优化、SQL查询优化、事务处理和连接池的使用等方面。 6. **Linux Bash Shell快速入门**: Linux Shell是操作...

    初级程序员考试试题

    对数据库安全性和性能调优也应有一定了解。 六、软件工程 软件开发过程中的文档编写、版本控制(如Git)、项目管理、测试方法(如单元测试、集成测试)以及软件质量保证等都是初级程序员应知应会的知识点。 通过...

    程序员面试宝典微软电子版(全)

    面试时,面试官可能会让你编写SQL语句,或者讨论如何优化数据库性能。 七、软件工程与设计模式 软件开发流程、敏捷开发、版本控制、测试方法、设计模式等,都是衡量一个程序员综合能力的重要指标。了解这些可以提升...

    疯狂java程序员的基本修养

    这份资源旨在帮助开发者全面提升其在Java领域的专业素养,包括但不限于编程基础、面向对象设计原则、异常处理、集合框架、多线程、网络编程、数据库操作以及高级特性等。 1. **Java编程基础**:这部分内容将引导...

    Java程序员+上班那点事儿

    11. **性能优化**:如何提高Java应用的性能是每个程序员都需要关注的问题,书中将探讨内存管理、垃圾回收机制以及性能监控工具的使用。 12. **职业规划与发展**:除了技术知识,书里还会讨论Java程序员的职业发展...

Global site tag (gtag.js) - Google Analytics