Sql server SQL Server:表中的最大行数
我开发的软件将大量数据存储在其中一个数据库表中(SQL Server版本8、9或10)。比方说,每天大约有100000条记录插入到该表中。这大约是每年3600万条记录。由于担心性能下降,我决定每天创建一个新表(名称中包含当前日期的表),以减少每个表的记录数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表是否有记录限制?或者,您知道在性能显著降低之前,一个表中可以存储多少条记录(或多或少)?我不知道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
- 每个表的行数:受可用存储限制
- 每个数据库的表:受数据库中对象数的限制
添加适当的磁盘空间(您无论如何都需要)和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