数据库性能的重要性
数据库在客户端-服务器时代具有非常显著的地位,但现今其中心地位已有所淡化。它们仅构成三个重要架构层的其中之一,不仅已高度商品化,而且很少并入内置业务逻辑。然而,数据库仍对应用程序的性能起着至关重要的作用,其中有两大主要原因:
* 只有数据库需要用来执行大量的物理磁盘 I/O,而现今的磁盘 I/O(相对于磁盘大小和 CPU 速度)比过 去更为关键。
* 在多层应用程序中,中间件层可方便地通过群集和负载平衡来扩展(但数据库却非常难于组建群集;对于大多数应用程序而言,扩展数据库服务器的难度要远大于扩展应用程序或 Web 服务器)
I/O 因素
在应用程序堆栈的所有层中,只有数据库层需要用来执行大量的物理 I/O,而众所周知 I/O 是所有操作中最缓慢的。尽管摩尔定律使 CPU 和内存访问速度呈指数级增长,但 I/O 设备的速度却只呈线性增长。也就是说,在 CPU 速度提升了 30 倍的这段时期里,磁盘 I/O 的速度仅提升了 4 倍。除此之外,磁盘存储容量也比 I/O 速度增长要快,这意味着对于任意给定容量的磁盘存储而言,I/O 能力实际上是下降了。
图 1. 虽然磁盘 I/O 速率提高了,但相对于 CPU 和磁盘存储容量却下降了。
由于 SQL 语句负责应用程序产生的几乎所有 I/O,因此调整 SQL 便成了避免应用程序 I/O 受限的关键。
非 I/O 性能问题
但很矛盾的是,调整不佳的 SQL 通常会使 CPU 受限而不是 I/O 受限。这是因为 RDBMS 系统采用了先进的高速缓存机制来避免发生不必要的物理 I/O。
某些次优的 SQL 语句会在执行期间反复访问数据。例如,臭名昭著的“嵌套表扫描”在读取外部表每一行的同时读取内部表的每一行。这些行基本上会缓存在内存中,因此当 SQL 在 I/O 方面显得非常高效时,由于会反复读取内存的相同块,因而将过度消耗 CPU。