Sql server SQL Server:表中的最大行数

Sql server SQL Server:表中的最大行数,sql-server,database-design,Sql Server,Database Design,我开发的软件将大量数据存储在其中一个数据库表中(SQL Server版本8、9或10)。比方说,每天大约有100000条记录插入到该表中。这大约是每年3600万条记录。由于担心性能下降,我决定每天创建一个新表(名称中包含当前日期的表),以减少每个表的记录数 你能告诉我这是个好主意吗?SQL server表是否有记录限制?或者,您知道在性能显著降低之前,一个表中可以存储多少条记录(或多或少)?我不知道MSSQL的具体情况,但3600万行对企业数据库来说并不算大-使用大型机数据库时,100000行对

我开发的软件将大量数据存储在其中一个数据库表中(SQL Server版本8、9或10)。比方说,每天大约有100000条记录插入到该表中。这大约是每年3600万条记录。由于担心性能下降,我决定每天创建一个新表(名称中包含当前日期的表),以减少每个表的记录数


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

我不知道MSSQL的具体情况,但3600万行对企业数据库来说并不算大-使用大型机数据库时,100000行对我来说就像一个配置表:-)

虽然我不太喜欢微软的一些软件,但我们这里讨论的不是Access:我认为他们可以用企业DBMS处理相当大的数据库大小


我怀疑,如果真的需要划分的话,用几天的时间来划分它可能太好了。

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

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

  • 你的排多大
  • 您存储的数据类型(字符串、BLOB、数字)
  • 您如何处理数据(只需将其作为存档,定期查询)
  • 你的表上有索引吗?有多少
  • 你的服务器规格是什么
等等


正如这里其他地方所回答的,每天100000英镑,因此每张桌子都是多余的——我建议每月或每周,甚至每季度。表越多,维护/查询的噩梦就越大。

您可以填充该表,直到有足够的磁盘空间为止

为了获得更好的性能,您可以尝试迁移到SQLServer2005,然后对表进行分区,并将部分放在不同的磁盘上(如果您的RAID配置确实可以帮助您)。分区仅在SQLServer2005的企业版中可用。你可以看看这个


您还可以尝试为最常用的数据部分创建视图,这也是解决方案之一。

这取决于具体情况,但为了简单起见,最好将所有内容都保存在一个表中

每天10万排其实并不是一个很大的数目。(取决于您的服务器硬件)。我个人见过MSSQL在一个表中处理多达100万行而没有任何问题。只要你保持你的索引有序,一切都会好的。关键是要有大量的内存,这样索引就不必交换到磁盘上

另一方面,这取决于您如何使用数据,如果您需要进行大量的查询,并且它不太可能需要跨多天的数据(因此您不需要加入表),将其分离到多个表中会更快。这通常用于工业过程控制等应用中,在这些应用中,您可能会每10秒读取50000台仪器上的值。在这种情况下,速度是非常重要的,但简单性不是

SELECT Top 1 sysobjects.[name], max(sysindexes.[rows]) AS TableRows, 
  CAST( 
    CASE max(sysindexes.[rows]) 
      WHEN 0 THEN -0 
      ELSE LOG10(max(sysindexes.[rows])) 
    END 
    AS NUMERIC(5,2)) 
  AS L10_TableRows 
FROM sysindexes INNER JOIN sysobjects ON sysindexes.[id] = sysobjects.[id] 
WHERE sysobjects.xtype = 'U' 
GROUP BY sysobjects.[name] 
ORDER BY max(rows) DESC
  • 数据库大小:524272 TB
  • 每个SQL Server实例的数据库数:32767
  • 每个数据库的文件组:32767
  • 每个数据库的文件数:32767
  • 文件大小(数据):16 TB
  • 文件大小(日志):2 TB
  • 每个表的行数:受可用存储限制
  • 每个数据库的表:受数据库中对象数的限制

在SQL Server 2005和2008中,我们有超过10亿行的表(每天增加3000万行)。我无法想象每天都要把这些东西放进一张新桌子里,然后把它们放进老鼠窝里


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

我们在一个表上溢出了一次整数主键(约24亿行)。如果有行数限制,你不太可能达到每年3600万行的数量。

我在Windows2003上的SQL Server 8上遇到的最大表是7.99亿行,有5列。但是,它是否有良好的意愿要根据SLA和使用情况来衡量-例如,加载50-100000000条记录,看看它是否仍然有效。

每月对表进行分区。这是处理每天大量涌入的表的最佳方法,无论是oracle还是MSSQL。

我有一个三列表,SQL Server 2008 R2中有60多亿行

我们每天查询,为客户创建逐分钟的系统分析图表。我没有注意到任何数据库性能问题(尽管它每天增长~1 GB的事实确实使管理备份比我希望的要复杂一些)

2016年7月更新

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

对于那些试图从SQL Server中删除200亿行的人,我强烈建议。链接死亡时的相关代码(阅读文章以获得完整解释):

2016年11月更新

如果您计划在一个表中存储这么多数据:不要。我强烈建议您考虑表分区(无论是手动的还是内置的,如果您在运行企业版)。这使得删除旧数据就像每周(每周/每月)截断一次表一样简单。如果您没有Enterprise(我们没有),您只需编写一个每月运行一次的脚本,删除超过2年的表,crea
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