4

这个问题与另一个问题有关:
拥有多个文件组有助于加快我的数据库吗?

我们正在开发的软件是一个分析工具,它使用 MS SQL Server 2005 来存储关系数据。初始分析可能很慢(因为我们正在处理数百万或数十亿行数据),但快速调用以前的分析有性能要求,因此我们“保存”每个分析的结果。

我们目前的方法是将分析结果保存在一系列“特定于运行”的表中,并且分析非常复杂,以至于每次分析可能会得到多达 100 个表。通常,这些表每次分析使用几百 MB(与我们数百 GB 或有时多个 TB 的源数据相比,这很小)。但总的来说,磁盘空间对我们来说不是问题。每组表都特定于一个分析,在许多情况下,这为我们提供了比引用源数据更大的性能改进。

一旦我们积累了足够多的已保存分析结果,这种方法就开始失效——在我们添加更强大的归档/清理功能之前,我们的测试数据库已攀升至数百万张表。但是,即使在生产中,拥有超过 100,000 张桌子对我们来说也不是一件容易的事。Microsoft 对 sysobjects 的大小(约 20 亿个)设置了一个非常巨大的理论限制,但是一旦我们的数据库增长到超过 100,000 个左右,像 CREATE TABLE 和 DROP TABLE 这样的简单查询就会显着减慢。

我们有一些空间来讨论我们的方法,但我认为如果没有更多上下文,这可能很难做到,所以我想更笼统地问这个问题:如果我们被迫创建这么多表,管理的最佳方法是什么他们?多个文件组?多个模式/所有者?多个数据库?

另一个注意事项:我对“简单地解决问题”(即增加 RAM、CPU 功率、磁盘速度)的想法并不感到兴奋。但我们也不排除它,特别是如果(例如)有人可以明确地告诉我们添加 RAM 或使用多个文件组将对管理大型系统目录产生什么影响。

4

4 回答 4

2

在没有首先查看整个系统的情况下,我的第一个建议是将历史运行保存在组合表中,其中 RunID 作为键的一部分 - 维度模型也可能与此处相关。该表可以分区以进行改进,这也将允许您将表分散到其他文件组中。

另一种可能性是将每次运行放在自己的数据库中,然后将它们分离,仅根据需要附加它们(并且以只读形式)

CREATE TABLE 和 DROP TABLE 可能表现不佳,因为主数据库或模型数据库没有针对这种行为进行优化。

我还建议与 Microsoft 讨论您选择的数据库设计。

于 2008-09-24T00:00:48.663 回答
1

这些表都是不同的结构吗?如果它们是相同的结构,您可能会使用单个分区表。

如果它们是不同的结构,但只是同一组维度列的子集,您仍然可以将它们存储在同一个表的分区中,并且在不适用的列中使用空值。

如果这是分析(可能是衍生定价计算?),您可以将计算运行的结果转储到平面文件中,并通过从平面文件加载来重用您的计算。

于 2008-09-23T22:42:34.560 回答
0

这似乎是您正在使用的一个非常有趣的问题/应用程序。我很想从事这样的工作。:)

你有一个非常大的问题表面积,这使得很难开始提供帮助。您的帖子中有几个解决方案参数不明显。例如,您计划将运行分析表保留多长时间?还有很多其他问题需要问。

您将需要认真的数据仓库和数据/表分区的组合。根据您要保留和存档的数据量,您可能需要开始对表格进行反规范化和展平。

这将是一个很好的案例,直接联系 Microsoft 可以互惠互利。Microsoft 获得了一个向其他客户展示的好案例,并且您可以直接从供应商那里获得帮助。

于 2008-09-23T22:25:26.413 回答
0

我们最终将数据库拆分为多个数据库。所以主数据库包含一个“数据库”表,它引用一个或多个“运行”数据库,每个数据库都包含不同的分析结果集。然后主“运行”表包含一个数据库 ID,检索保存结果的代码包括所有查询的相关数据库前缀。

这种方法使每个数据库的系统目录更加合理,它提供了核心/永久表和动态/运行表之间更好的分离,并且它也使备份和归档更易于管理。它还允许我们将数据拆分到多个物理磁盘上,尽管使用多个文件组也可以做到这一点。总体而言,鉴于我们目前的要求,它现在对我们来说运行良好,并且基于预期的增长,我们认为它也将适用于我们。

我们还注意到,SQL 2008 倾向于比 SQL 2000 和 SQL 2005 更好地处理大型系统目录。(当我发布这个问题时,我们还没有升级到 2008 年。)

于 2011-08-17T16:42:13.197 回答