背景
今天有个客户问我一个蛮有意思的问题。我使用的SQL SERVER 2008的数据库。目前数据库130多G了。其中某个表的就有3亿1千多万的记录数,占用了50多G。那SQL SERVER 数据库中某一表有没有行数限制和列数限制呢?会不会突然有一天,超过这个限制。我的系统就不能使用了?
分析
这个问题我们可以参考下表:
SQL Server 数据库引擎对象 | 最大大小/数量 - SQL Server(64 位) |
---|---|
每个 GROUP BY、ORDER BY 的字节数 | 8,060 |
每个索引键的字节数2 | 900 |
每个外键的字节数 | 900 |
每个主键的字节数 | 900 |
每行的字节数8 | 8,060 |
每个 varchar(max)、varbinary(max)、xml、text 或image 列的字节数 | 2^31-1 |
每个 ntext 或 nvarchar(max) 列的字符数 | 2^30-1 |
每个数据表的聚集索引数 | 1 |
GROUP BY、ORDER BY 中的列数 | 仅受字节数限制 |
GROUP BY WITH CUBE 或 WITH ROLLUP 语句中的列数或表达式数目 | 10 |
每个索引键的列数7 | 16 |
每个外键的列数 | 16 |
每个主键的列数 | 16 |
每个非宽表的列数 | 1,024 |
每个宽表的列数 | 30,000 |
每个 SELECT 语句的列数 | 4,096 |
每个 INSERT 语句的列数 | 4096 |
每个客户端的连接个数 | 已配置连接的最大值 |
数据库大小 | 524,272 TB |
每个 SQL Server 实例的数据库个数 | 32,767 |
每个数据库的文件组个数 | 32,767 |
每个数据库的文件个数 | 32,767 |
文件大小(数据) | 16 TB |
文件大小(日志) | 2 TB |
每个表的外键表引用数4 | 253 |
标识符长度(以字符计) | 128 |
每台计算机的实例数 | 独立服务器上为 50 个实例。 故障转移群集上 25 个实例。 |
包含 SQL 语句的字符串的长度(批大小)1 | 65,536 * 网络数据包大小 |
每个连接的锁数 | 每个服务器的最大锁数 |
每个 SQL Server 实例的锁数5 | 仅受内存限制 |
嵌套存储过程级别数6 | 32 |
嵌套子查询个数 | 32 |
嵌套触发器层数 | 32 |
每个数据表的非聚集索引个数 | 999 |
存在以下任意子句的情况下 GROUP BY 子句中的非重复表达式数目:CUBE、ROLLUP、GROUPING SETS、WITH CUBE、WITH ROLLUP | 32 |
GROUP BY 子句中的运算符生成的分组集数目 | 4,096 |
每个存储过程的参数个数 | 2,100 |
每个用户定义函数的参数个数 | 2,100 |
每个数据表的 REFERENCE 个数 | 253 |
每个数据表的行数 | 受可用存储空间限制 |
每个数据库的表数3 | 受数据库中对象数限制 |
每个分区表或索引的分区数 | 1,000 |
非索引列的统计信息条数 | 30,000 |
每个 SELECT 语句的表个数 | 仅受可用资源限制 |
每个表的触发器个数3 | 受数据库中对象数限制 |
每个 UPDATE 语句(宽表)的列数 | 4096 |
用户连接 | 32,767 |
XML 索引 | 249 |
行数限制
从表中可以看到,每个表的行数是受可用空间限制。而可用空间对于整个数据库达到,524,272 TB。这是非常大的。
不过值得注意的是,对于单个数据文件的大小限制是16TB。
自增列
刚才一位朋友提到了某种特殊的情况,如果表上的自增列情况呢?
create TABLE test (
id INT IDENTITY (2147483647,1),
name VARCHAR(100)
)
INSERT INTO test (name) VALUES ('Owen')
INSERT INTO test (name) VALUES ('Zeng')
果然溢出了。所以说,对于有自增列的表,表上的行数限制,跟定义的自增列的数据类型,起始值,步长都有关系。
针对这种情况可以使用bigint类型。防止超过行数限制。
列数限制
而对于列数,非宽表的最大列数是1024.对于关系型数据库这个值也非常大了,很难想象,你的列数超过这个值。
当然这个1024 只是理论值,和上面的自增列一样还是有其他条件制约着列数的限制。请看下面的例子:
CREATE TABLE test(id char(4030),name char(4030),title CHAR(10))
我的表才3个列就不让我创建了,,,这个数据库太无情了,,,,,,
这是为什么呢? 从之前的表上我们可以看到,字节数8060.其中包括7字节的内部开销。
所以,列数限制还和你定义的列的长度有关.
而表中的其他项目就不一一赘述了。各位需要的时候可以仔细的比对。
引用
微软官方文档:https://technet.microsoft.com/zh-cn/library/ms143432(v=sql.100)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29817552/viewspace-2120922/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29817552/viewspace-2120922/