SQLSERVER数据库会装满吗?最大容量是多少?
概述
今天有个客户问我一个蛮有意思的问题。我使用的sqlserver2008,目前数据库130多g,其中某个表的记录条数就有3亿1千多万,占用了50多g。那sqlserver数据库中的表有没有行数和列数限制呢?会不会突然有一天,超过这个限制,我的就不能使用了?
最大容量
sql server 是否会被装满,主要是在于数据库的最大容量。包括最大行数和最大列数 以及其他。 具体内容,我们可以查看下面列表:
sql server 数据库引擎对象 |
最大大小/数量 |
---|---|
每个 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 |
每个用户定义函数的参数个数(个人理解为就是我们写的sql语句) |
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字节的内部开销。
所以,列数限制还和你定义的列的长度有关.
其他
对于其他容量限制就不一一赘述了,后续如果有遇到的时候再补充。
引用
补充:今天就遇到了自己写的sql语句查询的时候,发现参数传入超过了2100个,语句就报错了。就查看了上面的文章,原来sqlserver对参数有限制,即:
每个用户定义函数的参数个数(个人理解为就是我们写的sql语句) |
2,100 |
解决方法为:分为多次查询,每次查询2000个,最后将多次查询的结果汇总。