在我以前的工作中,当需要一份报告时,我可以和某人坐下来,调出结果并立即得到反馈,然后优化我的查询,最终在 30-90 分钟内以我们需要的格式获得我们需要的数据。
我刚刚开始在一家新公司工作,该公司的数据库包含数百万条记录,我花了整整 8 个小时来制作一份报告,如果不是因为查询需要处理的数据量巨大,而且我无法像往常一样请需要数据的人坐下来在我获取结果时给我反馈,我觉得我可以在不到 2 小时内完成这份报告。
所以我正在想办法让服务器运行得更快……快很多,这样我就能保持与过去相同的工作效率。我突然想到的一个想法是,现在内存很便宜,根据我的计算,我可以用 1000 美元买 10 个 8G 内存条。但我从未听说过有哪个设备可以让我把它们组合成一个巨大的内存驱动器。
所以我想知道是否存在这样的设备,如果不存在,我实际可以制造的最大的 RAM 驱动器是多少,以及我该如何去做?
编辑:对于说需要分析数据库结构图的人……您无法通过规范化或索引表来加快诸如“从某个表中选择 f1、f2、f3 等”之类的查询的运行速度。我所说的绝对是需要在硬件级别提高性能。
我习惯于在几秒钟内得到结果,而不是几分钟或更短的半小时。也许这就是你们习惯的,你们有 1000 亿条记录的表,你们觉得这很快,但我希望从大约 1000 万条记录的表中返回结果,最多在半分钟内返回给我。
答案1
查看Fusion-IO 的 ioMemory 平台. 它们提供基于闪存的高容量和高性能硬件。
答案2
我突然想到,现在内存这么便宜,我计算了一下,1000 美元可以买 10 个 8G 内存条。但我从未听说过有设备可以让我把这些内存条组合成一个巨大的内存驱动器。
如果您不知道自己在做什么,那么这种想法看起来不错,但当您仔细考虑之后,它就会土崩瓦解。
瞧,问题是 - 你说要制作一个 80gb RAM 驱动器,但为什么不将 RAM 插入服务器并让 SQL Server 缓存使用内存呢?对于服务器来说,80GB 现在不算什么。
完全没有必要使用 RAM 驱动器,因为 SQL Server 只需要足够的 RAM 来缓存所有需要的数据。
否则,一个好的基于 SSD 的磁盘系统也有帮助——非常快并且相当划算。
顺便提一句:
包含数百万条记录的数据库
那太小了。如今你说几千亿,那你就回来吧。
答案3
正如 TomTom 所说,RAM 驱动器不会有一点帮助,但更多的 RAM 和/或更快的数据库驱动器可能会有帮助。
但是,除了投入更多硬件来解决这个问题之外,您的问题可能实际上出在其他地方(而且更多的硬件带来的好处会比您预期的要少得多):
- 你确定你的索引和一般数据库设计都很好吗?它们可以有一个巨大的性能影响。
- 您的查询也是如此。它们可以针对您的特定数据结构进行优化吗?使用您的数据库分析工具来帮助您解决这两个问题。
- 看起来您在创建报告查询时采用了反复试验的方法,我认为这有点奇怪。这是因为您没有从需要报告的人那里得到很好的要求,还是因为您不完全了解数据结构和/或查询语言?这两个问题都应该得到解决,但如果这不可能,也许您可以使用生产数据的一小部分来制定查询,并且只有在您对查询感到满意时才对完整数据集运行它们。
答案4
好吧,尽管数据库仍然物理地位于硬盘上,但 sql server 和 oracle 都支持在 RAM 中运行。其他 RDBMS 提供商也支持此功能。如今 bladecenter 和其他模块化服务器系统都很流行,但在寻找真正特别的东西时,我总是会考虑支持大量安装 RAM 的 TYAN 主板。
但我仍然认为数百万条记录并不是无法在短时间内处理的,我宁愿先看一下模式,尤其是表之间的索引和关系列。
我也想建议看一下 Fusion-IO 平台,但是当考虑大存储时,它可能变得非常昂贵。当尝试配置大 IO 吞吐量时,您可以考虑使用外部 RAID 卡将 2 个廉价 RAID 阵列组合成 RAID 100,这确实是无与伦比的。即使没有直接支持 RAID 100 的阵列控制器,您也可以构建 2 个磁盘阵列,每个都在 RAID 10 中,然后使用外部附加阵列控制器使用 RAID 0 将两个阵列连接在一起,这样您就有了在 2 个级别上剥离的镜像存储,实际的 IO 性能提升约为 150-180%,而且这种解决方案可能很便宜。如果您不想丢失一半的存储空间,您可以考虑 RAID 600,它仍然很稳定,但只使用 2 个磁盘进行奇偶校验。如果启动 RAID 6 配置为使用至少 5 个硬盘驱动器,那么这种解决方案可能比 RAID 100 更好。