SQL Server:表中的最大行数

Mar*_*mke 73 sql-server database-design

我开发的软件在其数据库表(SQL Server版本8,9或10)中存储了大量数据.假设每天大约有100,000条记录插入到该表中.这大约是每年3600万条记录.由于担心我会失去性能,我决定每天创建一个新表(一个名称中包含当前日期的表)以降低每个表的记录数.

你能告诉我,这是不是一个好主意?SQL服务器表是否有记录限制?或者您知道在性能显着降低之前可以在表中存储多少条记录(或多或少)?

小智 88

这些是SQL Server 2008 R2的一些最大容量规范

  • 数据库大小:524,272太字节
  • 每个SQL Server实例的数据库:32,767
  • 每个数据库的文件组:32,767
  • 每个数据库的文件数:32,767
  • 文件大小(数据):16 TB
  • 文件大小(日志):2太字节
  • 每桌行数:受可用存储空间限制
  • 每个数据库的表:数据库中对象数量的限制

  • 发布此为懒惰:252,695,124年. (72认同)
  • @philthyfool:显然很多人都很懒,因为我的评论已经被投票和错误了4年.... (21认同)
  • 我怀疑如果你有超过9,223,372,036,854,775,807行你会遇到问题(最大的'bigint`) (20认同)
  • @NotMe不要复活和挑剔,但我得到了252695124297年.(有时我希望我是你提到的懒惰人口) (15认同)
  • 你有没有计算过OP提到的100000行/天的行数所需的年数? (10认同)
  • @NotMe哈哈真的.我向你扔了一个upvote,因为这一点已经完成,只是想到也许一些正确的数字应该可用于任何像我这样的低级生命偶然发现这个答案. (4认同)
  • @philthyfool闰年的一天是一个巨大的差异.我得到252,522,163,911.而且,这些都是我生命中非常好的分钟,我现在无法回来. (3认同)

Dan*_*ard 44

我有一个三列表,在SQL Server 2008 R2中有超过60亿行.

我们每天都会查询它,为我们的客户创建逐分钟的系统分析图表.我没有注意到任何数据库性能命中(尽管事实上它每天增长~1 GB确实使管理备份比我想要的更多一些).

2016年7月更新

行数

在备份变得足够大以至于我们决定截断两年以上的记录(大约700 GB存储在多个备份中,包括昂贵的磁带上)之前,我们已经达到了大约245亿行.值得注意的是,在这个决定中,绩效并不是一个重要的动力(即,它仍然很有效).

对于那些发现自己试图从SQL Server中删除200亿行的人,我强烈推荐这篇文章.链接死亡时的相关代码(阅读文章以获得完整说明):

ALTER DATABASE DeleteRecord SET RECOVERY SIMPLE;
GO

BEGIN TRY
    BEGIN TRANSACTION
        -- Bulk logged 
        SELECT  *
        INTO    dbo.bigtable_intermediate
        FROM    dbo.bigtable
        WHERE   Id % 2 = 0;

        -- minimal logged because DDL-Operation 
        TRUNCATE TABLE dbo.bigtable;  

        -- Bulk logged because target table is exclusivly locked! 
        SET IDENTITY_INSERT dbo.bigTable ON;
        INSERT INTO dbo.bigtable WITH (TABLOCK) (Id, c1, c2, c3)
        SELECT Id, c1, c2, c3 FROM dbo.bigtable_intermediate ORDER BY Id;
        SET IDENTITY_INSERT dbo.bigtable OFF;
    COMMIT
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK
END CATCH

ALTER DATABASE DeleteRecord SET RECOVERY FULL;
GO
Run Code Online (Sandbox Code Playgroud)

2016年11月更新

如果您打算将这么多数据存储在一个表中:不要.我强烈建议您考虑表分区(如果您正在运行企业版,则需要手动或使用内置功能).这使得丢弃旧数据就像截取表格一样简单(周/月/等).如果您没有Enterprise(我们没有),您只需编写一个每月运行一次的脚本,删除超过2年的表,创建下个月的表,并重新生成一个连接所有分区的动态视图桌子在一起,便于查询.显然,"每月一次"和"超过2年"应由您根据对您的用例有意义的内容来定义.直接从具有数百亿行数据的表中删除将a)花费大量时间并且b)将事务日志填满数百或数千次.

  • 高达105亿,仍然喋喋不休.只是不要尝试执行COUNT().;) (13认同)
  • 这是一年,我们有165亿行.我们刚刚添加了一个额外的数据源,所以它现在增长得更快一些.我们还将此数据库移动到其自己的SQL实例,以允许我们专用内存而不会使服务器上的其他数据库匮乏.我仍然能够在不到一秒的时间内在过去3年中的任何24小时内绘制任何数据点.我们的分析师喜欢它. (6认同)
  • @ Jeroen1984这是一台虚拟机,运行在具有两个Intel®Xeon®CPU E5-2430处理器的Hyper-V主机ProLiant DL360e Gen8上。VM具有38GB的静态分配的RAM,以及一些我不记得的虚拟处理器。 (2认同)

Ras*_*ack 34

很难给出一个通用的答案.这实际上取决于多种因素:

  • 你的行的大小
  • 你存储什么样的数据(字符串,blob,数字)
  • 你如何处理你的数据(只需将其保存为存档,定期查询)
  • 你的桌子上有索引 - 有多少
  • 什么是你的服务器规格

等等

正如在这里的其他地方所回答的那样,每桌10万次,因此每张桌子都是矫枉过正 - 我建议每月或每周甚至每季度一次.表格越多,维护/查询的噩梦就越大.

  • 我想重新强化"更大的维护/查询噩梦" - 从个人经验来看,我会避免分裂成瘟疫之类的表格. (13认同)

pax*_*blo 19

我不是特别了解MSSQL,但3600万行对于企业数据库并不大 - 使用大型机数据库,100,000行听起来像配置表给我:-).

虽然我不是微软某些软件的忠实粉丝,但这不是我们在这里谈论的Access:我认为他们可以使用企业DBMS处理相当大的数据库大小.

我怀疑,如果确实需要分裂的话,几天的分辨率可能太过分了.


Sas*_*cha 19

我不知道行限制,但我知道行超过1.7亿行.您可以使用分区表(2005+)或连接多个表的视图加快速度.


Nat*_*han 5

这取决于情况,但我想说,为了简单起见,最好将所有内容都放在一张表中。

每天 100,000 行并不是一个很大的数字。(取决于您的服务器硬件)。我亲眼目睹 MSSQL 在单个表中处理多达 100M 行,没有任何问题。只要你保持索引有序,一切都应该很好。关键是要有足够的内存,这样索引就不必交换到磁盘上。

另一方面,这取决于您如何使用数据,如果您需要进行大量查询,并且不太可能需要跨越多天的数据(因此您不需要联接表),那么它将是更快地将其分成多个表。这通常用于工业过程控制等应用,您可能每 10 秒读取 50,000 个仪器上的值。在这种情况下,速度极其重要,但简单性则不然。


Not*_*tMe 5

我们在SQL Server 2005和2008中有表,其中包含超过10亿行(每天增加3000万行).我无法想象每天都会把那个分成一张新桌子的老鼠窝弄下来.

添加适当的磁盘空间(无论如何你需要)和RAM要便宜得多.