SQL Server 2000表

我们目前有一个SQL Server 2000数据库,其中一个表包含多个用户的数据。 数据是由整数字段的成员id键入的。 该表在memberid上有一个聚集索引。

这个performance在大约有2亿行。 索引和维护正在成为问题。 我们正在辩论将表格分解成每个用户模型的一个表格。

这意味着我们最终会得到大量的表格,可能会达到2,147,483,647,只是考虑到正面的价值。

我的问题:

  1. 有没有人有任何SQL Server(2000/2005年)安装数百万表的经验?

  2. 这种体系结构在使用查询分析器,企业pipe理器等维护和访问方面有什么意义。

  3. 在数据库实例中拥有如此大量的索引会产生什么影响?

所有的意见是赞赏。

谢谢

编辑:我不同意这个问题被迁移到Serverfault。 这是一个编程相关的问题。

这里有一些想法:

1)不要这样做。 认真。 数以百万计的桌子将是一场噩梦,可能会造成比解决问题更多的问题。

2)如果你真的想把表格分成多个表格,你不需要那么多。 根据你的硬件,我预计5000万行是没有问题的,所以你可以把你的数据分成4个表。

3)如果可能,我会做什么,将升级到SQL Server 2005或2008,并使用表分区。 这将允许您在一个表格中细分数据。 不是一个完美的解决scheme,但远远胜过数百万张桌子。

为了回答您的具体问题,我想说,SQL Server不太可能在一个实例中处理多个表,并且如果每个logging有一个表可能会使查询分析器等无用。

快速添加:从微软网站:

数据库对象包括所有表,视图,存储过程,扩展存储过程,触发器,规则,缺省值和约束。 数据库中所有这些对象的总数不能超过2,147,483,647。

http://msdn.microsoft.com/en-us/library/aa933149(SQL.80).aspx

非常神奇,这个号码是你指定的号码…嗯…

索引维护应该根据现有的碎片进行,而不是盲目的。 有了一个集群IDENTITY列,你不应该有太多的担心。 SQL傻瓜的碎片整理脚本将有所帮助。

2亿行是没有那么多,不值得分区恕我直言,因为查询开销,许多表名需要dynamicSQL等,除非你有一个小维护窗口,也许

我们每天有大约600万行插入,FWIW在一个表中。

根据你提供的信息,痛苦比收益更差。

分裂成许多表是一场噩梦,根本不推荐。 除了其他复杂性之外,还可以考虑添加新用户所需的复杂性 – 您是否必须dynamic创build新表?

答案只是更好的索引,专门针对您正在使用的查询devise的。 既然你没有详细说明这些查询,我不能给你具体的build议。

但是,一般来说,我们支持许多数据库,其大小与表一样大,是的,这可能是一种痛苦,但它绝对有可能。

如果你决定在那里实现分区,使用不同的方式来划分数据(可能是当前的数据与旧的数据),以及相当less的分区。 请记住,如果您“手动”(而不是使用SQL 2005+分区function),则对这些分区表的所有查询都可能必须重新devise。

编辑:在你的问题的一部分的具体答案,是企业pipe理器/查询分析器可以开始做非常糟糕的事情,当你有大量的表。 我们devise的数据库devise不佳,有数千个表,甚至不能在树视图中展开“Tables”文件夹而不用等待所有的时间。

每个用户一个似乎有点像矫枉过正和粗糙的代码库。 您或多或less必须在使用这些表的存储过程中使用dynamicSQL,这绝对会使您的生活和未来的开发和testing复杂化。 (我从经验讲,我们曾经有一些我们每天生成的非常复杂的表;与这些表的所有交互都是dynamicSQL。)

不知道使用这些数据的应用程序的要求,你可以将旧数据变成一个档案或历史表/表?

对于SQL 2k5 / 2k8,您可以使用分区表,这可能也有帮助,并从查询和应用程序中抽象出多个表。 有分区表的一些陷阱,但他们可能在这里工作。

有了这样的数量,你将不得不做一些特定的原型和基准,因为没有一个通用的答案。

听起来像表分区是要走的路。 但是至less需要SQL Server 2005。

这里是一个很好的文章,让你开始Kimberly Tripp MSDN文章

我会重新审视这个devise。

你说它是聚集在成员id,但是这可能会导致页面拆分(和碎片),当数据被添加。 更好地聚集在一个越来越多的代理人身份(并有一个唯一的索引,甚至可能是主要关键,将包括成员id)。

或者,即使不是集群,你也应该在memberid上有一个唯一的索引,剩余的列的唯一部分是唯一的,因为听起来你每个成员有多行。 只有memberid的索引肯定不太可能被覆盖。