我正在尝试确定处理数据库迁移需要多少 RAM(公司希望为我购买更多 RAM)。因素包括:
- Oracle 和 MySQL 之间传输的数据约为 3 GB
- 正在读取大约 900 GIG 的文件数据
- 使用 Java 创建我的处理脚本
我很好奇,想知道是否有任何方法可以通过数学推导出一个公式,或者仅仅估算额外的 2 GB 是否足够?我目前正在使用 1 GB 的 RAM。
答案1
如果两台 SQL 服务器都不频繁地将数据分页到磁盘,那么 1GB 的数据对于这个过程来说确实非常小。如果两台服务器恰好在同一台机器上,那么就更是如此了。
MySQL 上数据的最终大小(3 GB)并不特别令人担忧。任何现代 32 位 3 GB 台式计算机都可以处理。在 900 GB 源数据(Oracle)上运行的查询将显得过于繁琐。
我知道您现在担心的是 RAM,但其他可以大大提高性能的因素是 HDD 速度和处理器核心数量。首先,因为查询将数据从数据库带到磁盘上时会有大量 HDD 访问,其次,因为两个 SQL 服务器都擅长充分利用多核处理器。
至于 RAM:
您的 RAM 越多,查询可以从磁盘提取的数据就越多。许多、许多、许多因素都会影响 RAM 的重要性。最重要的因素可能是您的查询是否包含子查询和类似的 SQL 构造?如果是,Oracle 引擎将从磁盘中提取数据到内存临时表中,并在其执行计划中运行更高级别的查询。内存中可以驻留的数据越多,Oracle 需要重复此过程的次数就越少,并且需要将更少的数据分页回磁盘以构建最终结果。
然而,如果碰巧 Oracle 上查询的表不超过 1 或 2 GB,则您的数据库质量(我找不到正确的术语,但本质上是指 Oracle 上查询的表有多大)可以减少一些要求。
查询的质量必然会影响最需要的 RAM 数量。这里的顺序是索引、索引、更多索引。例如,像躲避瘟疫一样避免全文搜索,并且只在必须时才使用它,而不是在可以时才使用它。也要避免非索引搜索,因为这是您要从事的迁移任务)可以对表中比通常更多的列进行索引请记住,您只会从 Oracle 读取数据。最后,您必须确保在子查询的情况下尽最大努力对其进行优化,以免提取过多不必要的行。
多少内存?
恐怕无法确定确切的 RAM 数量。只有在您构建查询并准备启动该过程后,您才能知道单个事务中处理的数据量。
选择最繁重的事务(您知道在处理时会产生最多数据的事务)。估计在执行计划最密集的部分中它将产生多少行。获取每行所需的总内存(将每列所需的内存相加)并乘以行数。这就是自由的理想情况下,您需要避免分页的 RAM。
最后一个优化:
事务可能看起来是一种很好的优化做法。但要小心。整个过程中的瓶颈不是您从 900 GB 数据库中读取数据的速度有多快,而是在分页之前您可以在内存中保存多少数据。由于事务将作为一个单元执行,因此需要更多内存来保存临时结果和回滚数据。避免在处理大量数据的查询中使用事务。
此外,在整个过程中仅提取需要的列。SELECT *
除非您确实需要它,否则这真的不是一个好主意。
结论:
我无法按照您的要求提供 RAM 数量。您必须明白这样做是不公平的。我会骗您。您所需的 RAM 数量不仅受每个查询处理的数据量的影响,还受(即使程度较小)HDD 性能的影响,因为在您的情况下,发生一些数据分页是可以接受的。
您的处理器和操作系统也会限制您可以使用的 RAM 数量。如您所知,如果它们都是 32 位,则最多只能使用 ~3.8。如果它们是 64 位,您可以在其中塞入 1 TB 的 RAM,而不必再为此担心。
最后,将 Oracle 服务器与 MySQL 服务器分开也会大大减少您的 RAM 需求。Oracle 服务器将成为您的首选,而 1 Gb RAM MySQL 服务器将非常乐意处理传入数据。
但有一件事我可以告诉你,不要用 1Gb RAM 来尝试。如果你有一台 32 位机器,请将其升级到完整的 4Gb。
一切顺利。
答案2
以目前的 RAM 价格来看,贵公司在这方面的投资并不大。
因此,如果购买 3GB RAM 后发现不够用,那就太荒谬了。
选择 4GB 的 RAM,即使在 32 位操作系统中显卡会占用第 4 GB 的一部分。
从非数学角度来说,4GB 应该足够了。如果不够,那么贵公司的下一笔投资应该是 8GB 的 64 位操作系统(也许还有一台新电脑)。