在它变得难看之前,我可以在Sql server表中存储多少条记录?

时间:2010-05-07 11:54:43

标签: sql sql-server sql-server-2008

我被要求为新系统做一些性能测试。 它只是与少数客户一起运行,但正如他们期望的那样,这些是我为我的测试工作的数字:

200个客户端,4年的数据,以及每5分钟的数据更改。所以每个客户每5分钟就有1条记录。 这意味着每个客户每年365 * 24 * 12 = 105.000条记录,这意味着我的测试有80万条记录。 它有一个FK到另一个表,一个PK(uniqueidentifier)和一个clientID上的索引。

这是SqlServer所嘲笑的事情,因为它并没有吓到他,这对于一个四核8 GB机器来说太过分了,这是在边缘,还是......

有没有人对这些数字有任何经验?

7 个答案:

答案 0 :(得分:28)

字段PK应该尽可能小而不是随机的 - GUID在这里很糟糕。主要问题是:

  • PK在所有外键中用于引用行,因此大PK使用更多空间?=更多IO。
  • 随机PK意味着在整个地方发生插入=很多页面拆分=效率低下的索引使用。

那有多糟糕?我知道在某些情况下你会失去80%的速度。

否则 - 没问题。我有一个超过8亿行的表,并且那里的东西非常快;)当然,你需要有不错的查询,体面的索引,显然不能在单个5400 RPM绿色硬盘上运行才能有效 - 但是IO而不是愚蠢的查询和一些不错的索引,SQL不会在几十亿行上批量生成。

所以,虽然“它取决于”,但通用的答案是大表不是问题...... ......除非你做MASS删除。删除一半的表将是一个巨大的事务,这就是为什么分区很适合像会计这样的东西 - 每年一个分区表意味着我可以摆脱没有DELETE语句的年份数据;)

答案 1 :(得分:10)

软件可以处理它,你的服务器可以吗?好吧,取决于

你刚存档吗?肯定会得到一千亿行,它并不关心,性能问题会在你查询数据时出现。它获得的越大,就总存储和数据操作(删除,回滚段等)所需的空间就越多,最好是在内存中,但如果不是,则在快速的tempdb驱动器上。

SQL服务器比大型数据集上的处理器更重要(尽管处理器肯定会影响 time ,而不是它可以处理的查询/数据的阈值)是内存和空间(两者都是HD和RAM因为它会溢出到TempDB以进行大型操作),这就是容量。对于性能,您需要磁盘IO,内存和处理器能力。

只要你有足够的空间,它可以处理它的简短答案。它处理它足够快?这取决于您正在运行的查询类型以及性能的重要性。

最后一件事,don't forget to take a look at other questions here on optimizing large tables

答案 2 :(得分:8)

SQL Server可以毫不费力地存储这么多记录。

如果您已正确设计索引,并且数据库已正确规范化,那么访问任意数量的记录绝对没有问题。通常情况下,当数据库中没有信息时,人们很早就会做出糟糕的设计决策,而你永远不会知道它,因为everything is fast for small "n"

因此,虽然我会说SQL Server可以处理你正在做的事情,但我也会说现在是坐下来看看你的查询表现如何的好时机使用SQL Server Profiler。一切都还快吗?您是否在频繁查询中看到过多的扫描或散列,这会导致性能下降?如果是这样,现在是分析和解决这些问题的时候了。


顺便说一下,人们真的很想根据行数和列数来考虑大小限制。尝试更进一步讨论 bytes ,因为最终,字节是报告查询中扫描的内容,字节是存储到磁盘的内容。

答案 3 :(得分:5)

真的太多了。我负责一个拥有200万注册用户的网站。

我们的一些表有超过1亿条记录,我们可以通过400万每日页面浏览量获得出色的性能,但我必须承认,使用良好的架构进行缓存是事情不会变得难看的主要原因。

答案 4 :(得分:4)

如果你追求极致的高性能,我会将PK设计成不是一个独特的标识符。如果你需要合并数据集,我会使用INT IDENTITY + SMALLINT(甚至是tinyint)来确定原始位置。您没有多说您的设计,但尝试将uniqueidentifier用作聚簇索引时存在问题。

鉴于适当的服务器硬件,大多数体面的设计都会做得很好。不要计划在服务器上运行除OS和SQL Server之外的任何内容。主要关注的是RAM,为了获得最佳性能,您需要足够的RAM用于整个数据库,标记等,这超出了操作系统将用尽的内容。我甚至看到大型服务器帮助糟糕的设计运行得非常好。

答案 5 :(得分:3)

SQL Server可以处理数TB的数据。踢球者是你正确设计并拥有合适的设备组合。例如,您可能需要分区。您肯定需要考虑每个查询的每毫秒性能,并避免表现不佳的设计和查询技术,如EAV表和相关子查询和游标以及“喜欢'%sometext%'”。

如果您希望您的数据库那么大,那么购买并阅读封面以涵盖有关性能调整的书籍,然后再开始设计。糟糕的设计会导致数据库性能下降,一旦拥有80,000,000条记录,就很难纠正。

我还建议您找一位具有高性能,高容量数据库经验的dba。这是一个全新的游戏设计明智,它需要从一开始就是thoguht。

在系统具有该记录数之前,您现在可以进行此类测试。

答案 6 :(得分:2)

即使MS Access也可以嘲笑50万行表(取决于行大小)。

如果您对配置文件没有任何疑问,请将该表视为文件。与sp_spaceused相比,行不是重要的数字。

如果您确实有某些疑问,请将该表视为数据结构。如何使用最少的IO来满足查询。使用查询计划和SET STATISTICS IO ON