当我将数据库表分布在不同的硬盘上时,性能会有所提高吗?
我需要同时访问许多不同的模式,并且我想知道当我将表分布在不同的硬盘上时,添加更多硬盘是否会显著提高性能。
假设我有100 张表和 1 个硬盘对比100 张表和 10 个硬盘。这会有什么不同吗?或者我最好将硬盘驱动器连接到 RAID 配置中?
答案1
通常来说,增加硬盘数量确实能提高理论上的 IO 性能。有用量方法上有很大不同。在许多实际应用中(对于较少数量的磁盘),IO 性能的提高甚至不是接近线性的。
例如,在达到 (RAID) 控制器的极限的情况下,更多的磁盘并不能提高性能。在较旧或便宜的 (RAID) 控制器上安装 10 个高端 SSD 通常会导致控制器而不是磁盘成为限制因素。 RAID 级别至少在提供数据保护方面与提供性能方面同样重要。
RAID 1(镜像)中的 2 个磁盘不会给您带来任何额外的写入性能,但在良好的控制器上仍会使读取性能翻倍。
手动将(虚拟)磁盘分配给某些任务可为这些任务提供有保障的 IO 路径,从而允许这些任务达到一定程度的并发性,例如数据库管理员喜欢这样做。当然,这也会限制每个单独任务的峰值性能。对于任何(手动)调整,如果操作错误,都会极大地影响性能 :)
单个企业级 15k SAS 旋转磁盘通常提供约 200-250 IOPS(每秒 IO 操作)。简单地说,10 个磁盘将提供该值的十倍。
如果在您的示例中,一个表被主要使用,则将该表分配给 1 个磁盘,而将其他 99 个表放在其他剩余磁盘上,这没有可衡量的好处,实际上您仍然会被限制在 200 IOPS 左右。但是,在这种情况下,将所有 100 个表放在一个 RAID 10 卷上,您将拥有所有 10 个磁盘,因此读取操作的 IOPS 为 2000+,写入操作的 IOPS 为 1000(由于镜像,有效资源为一半磁盘,5 个磁盘)... 大幅增加。
答案2
增加 I/O 吞吐量几乎总能提高性能。但是,对于一定数量的表或数据库应该使用多少硬盘,并没有神奇的公式。需要考虑的因素太多了:数据大小、架构设计、写入或读取量、查询数量等。
除了添加额外的硬件之外,分析表结构和针对数据库运行的最常见查询总是有帮助的。有时,只需为常用请求的数据添加索引就能产生意想不到的效果,即使投入更多硬件也无法实现。
答案3
除了增加物理磁盘数量外,您还需要修改 Oracle 以运行更多并行进程。我这样做:
NAME CURRENT_MEMORY_VALUE
------------------------------ ---------------------
parallel_max_servers 32
parallel_min_servers 8
parallel_servers_target 32
parallel_threads_per_cpu 4
进行这些更改的命令是:
alter system set PARALLEL_MIN_SERVERS=8 scope=memory; <== RAC
alter system set PARALLEL_MIN_SERVERS=8 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=memory; <== RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=memory; <== RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=memory; <== RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=spfile sid='*'; <== RAC
alter system set PARALLEL_MIN_SERVERS=8 scope=both; <== NON RAC
alter system set PARALLEL_MAX_SERVERS=32 scope=both; <== NON RAC
alter system set PARALLEL_SERVERS_TARGET=32 scope=both; <== NON RAC
alter system set PARALLEL_THREADS_PER_CPU=4 scope=both; <== NON RAC