为了提高 SQL 性能,为什么不投入大量 RAM 而不是使用更快的硬盘呢?

为了提高 SQL 性能,为什么不投入大量 RAM 而不是使用更快的硬盘呢?

人们一直告诉我,为了提高 SQL 服务器的性能,应该购买带有 RAID 5 等功能的最快的硬盘。

所以我在想,与其花大价钱购买 RAID 5 和超快硬盘(顺便说一句,这并不便宜),为什么不直接购买大量 RAM?我们知道 SQL 服务器将数据库加载到内存中。内存比任何硬盘都快得多。

为什么不在服务器上塞入 100 GB 的 RAM?然后只需使用带有 RAID 1 的常规 SCSI 硬盘。这不是更便宜、更快吗?

答案1

您的分析很好——在一定程度上——它绝对会让事情变得更快。不过,您还需要考虑其他几个问题:

  1. 并非每个人都能负担得起足够的内存;当您拥有数 TB 的数据时,您必须将其放在磁盘上。如果您没有太多数据,那么任何速度都足够快。

  2. 数据库的写入性能仍然会受到磁盘的限制,这样您才能信守数据实际存储的承诺。

如果你有一个小数据集,或者不需要将其保存在磁盘上,那么你的想法没有错。像伏特数据库正在努力减少 RDBMS 实现中旧假设所产生的限制纯内存性能的开销。

(顺便说一句,那些告诉你使用 RAID-5 来提高数据库性能的人可能不是这个话题上的好听众,因为它几乎从来都不是最好的选择 - 它的读取性能很好,但写入性能很差,并且写入几乎总是生产约束 - 因为你可以将 RAM 放入缓存中来解决大多数读取端性能问题。)

答案2

简短版本:考虑工作集大小。详细版本:您的数据有多大?如果它可以装入现代服务器的内存中,是的,您完全正确。不幸的是,目前最大的 Xeon 可以处理 2TB 的 RAM,而这不再是一个大数据集。如果您买不起足够大的机器来将整个工作集装入 RAM 中,那么您就不得不用大脑而不是钱包来解决问题。

答案3

如果你追求速度:

  • 增加 RAM,以便至少经常使用的索引可以完全放入 RAM 中(例如,在我工作的系统上,32GB RAM 对于 350GB 的数据库来说已经足够了,因为索引是 RAM 中所需要的,而不是原始数据)
  • 对任何磁盘使用 RAID10(磁盘越快越好)
  • 避免RAID5
  • 将 mdf、ldf 和 temp DB 拆分到离散的主轴组上(例如:tempdb 在其自己的 RAID1 组上,ldf 在其自己的 RAID1 或 RAID10 主轴组上,mdf 在其至少有 4 个磁盘的 RAID 10 组上)

按照这些步骤,SQL Server 将会飞起来。

然后,如果您愿意,可以添加更多 RAM...但请先执行上述操作,然后您可能会发现已经完成。

答案4

多年来,我在这个领域做了很多工作。以下是你真正需要考虑的问题。首先是你的工作数据集有多大。理想情况下,你希望你的工作数据集尽可能多地存储在 RAM 中。第二个问题不是速度,但我认为对于任何数据库来说都是如此。你将拥有某种受保护的存储。假设你有受保护的存储,它显然是某种 RAID 设置。RAID 的问题在于你需要考虑某些惩罚和权衡。但是,除了极端情况外,大多数这些权衡都可以减少,甚至完全消除,只需拥有大量合适的现金,并且为了一致性,它会被镜像。

以下是我的建议。

  1. RAM 应该是您的操作系统、系统上运行的服务、数据库应用程序的工作数据集以及数据库缓存大小所需的 RAM,不需要交换到磁盘。
  2. 您的存储(无论是在设备上还是在网络上)应具有低延迟和高带宽。例如,如果您使用的是 NAS 设备,请确保您拥有非常高速的网络,最低为 2×10 Gb,但在当今世界,我会使用 25 Gb。如果它是本地的,那么除了下面第 3 个问题之外,一切都很容易。
  3. 您的磁盘显然受到保护,并且这种保护通常由某种 RAID 控制器完成。如果您使用的是外部设备,请获取具有最小镜像写缓存的设备。此时,基于内部调查的速率控制器可能无法提供该功能,但一定质量的 Naz 设备通常会与 SAN 设备一起提供。

很久以前,我花了很多钱购买 EMC 存储,主要原因是镜像写入缓存比其他人的缓存大得多,这使得写入可以更快地提交到数据库中,它本质上是写入镜像 RAM 并确认 Wite。我们甚至将五六个高性能但较小的 raid 存储设备与一个 AMC 进行了比较,但大缓存完全击败了所有其他存储排列。较大的读取缓存非常有用,但是,服务器上的额外 RAM 用于缓存以提供更好的读取性能要便宜得多。

相关内容