利用更多的资源
可利用更多的资源,达到优化数据库的目的。
客户端的多进程并行访问
多进程并行访问是指在客户端创建多个进程(线程),每个进程建立一个与数据库的连接,然后同时向数据库提交访问请求。当数据库主机资源有空闲时,我们可以采用客户端多进程并行访问的方法来提高性能。如果数据库主机已经很忙时,采用多进程并行访问,性能不会提高,反而可能会更慢。所以,最好与DBA 或系统管理员进行沟通后再决定是否采用这种方式。
例如:我们有10 000 个产品ID,现在需要根据ID 取出产品的详细信息,如果单线程访问,按每个IO 要5ms 计算,忽略主机的CPU 运算及网络传输时间,我们需要50s才能完成任务。如果采用5 个并行访问,每个进程访问2000 个ID,那么10s 就有可能完成任务。
那是不是并行数越多越好呢?开1000 个并行,是否只要50ms 就能搞定?答案肯定是否定的。当并行数超过服务器主机资源的上限时性能就不会再提高,如果再增加,反而会增加主机的进程间调度成本和进程冲突概率。
以下是一些如何设置并行数的基本建议:
(1)如果瓶颈在服务器主机,但是主机还有空闲资源,那么最大并行数取主机的CPU核数和主机提供数据服务的磁盘数两个参数中的最小值,同时要保证主机有资源做其他任务。
(2)如果瓶颈在客户端处理上,但是客户端还有空闲资源,那建议不要增加SQL 的并行,而是用一个进程取回数据后,在客户端起多个进程处理即可,进程数根据客户端的CPU 核数计算。
(3)如果瓶颈在客户端网络,那建议做数据压缩或者增加多个客户端,采用mapreduce 的架构处理。
(4)如果瓶颈在服务器网络,那需要增加服务器的网络带宽或者在服务端将数据压缩后再处理了。
数据库的并行处理
数据库的并行处理是指客户端一条SQL 的请求,数据库内部自动分解成多个进程并行处理,如图3-8 所示。
并不是所有的SQL 都可以使用并行处理,一般只有对表或索引进行全部访问时才可以使用并行。数据库表默认是不打开并行访问的,所以需要指定SQL 并行的提示,如下所示:
select /*+parallel(a,4)*/ * from employee;
并行的优点:
使用多进程处理,充分利用数据库主机资源(CPU 和IO),提高性能。
并行的缺点:
(1)单个会话占用大量资源,影响其他会话,所以只适合在主机负载低的时期使用。
(2)只能采用直接IO 访问,不能利用缓存数据,所以执行前会触发将脏缓存数据写入磁盘的操作。
注:(1)并行处理在OLTP 类系统中慎用。使用不当会导致一个会话把主机资源全部占用,而正常事务得不到及时响应,所以其一般只是用于数据仓库平台。
(2)一般而言,对于百万级记录以下的小表采用并行访问的话,并不能提高,反而可能会更差。
写在最后:性能优化是一门艺术,选择了正确的方法可以让你事半功倍。本文的优化法则带给你的是正常思路,也可以说是基本知识。当然,也许有很多专家提出一些新的“奇门武功”,但往往不是常人可掌控,甚至会使人“走火入魔”,Oracle 数据库中的一些配置参数优化就曾经让许多人“走火入魔”。在这里还需要强调一点,技术人最容易犯的错误是过度优化。
切记,性能优化是无止境的。当性能达到业务期望时,就不要再过度优化了,因为优化的成本会越来越高,过度优化会让系统的可维护性及可扩展性降低。