• 我的SQL SERVER数据库会装满吗?


    概述

      今天有个客户问我一个蛮有意思的问题。我使用的SQL SERVER 2008数据库,目前数据库130多G,其中某个表的记录条数就有3亿1千多万,占用了50多G。那SQL SERVER 数据库中的表有没有行数和列数限制呢?会不会突然有一天,超过这个限制,我的系统就不能使用了? 

    最大容量

          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

    每个用户定义函数的参数个数

    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)

    作者:Owen Zeng
    如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    自学编程的人,都是怎么找到自己的第一份工作的?
    自学编程的人,都是怎么找到自己的第一份工作的?
    滴滴工程师带你深入理解 TCP 握手分手全过程
    c语言之利用#if #endif来进行注释或者运行不同的主函数
    c语言之字符指针变量和字符数组的异同
    程序员自我学习自我培训指南
    海量存储之十六–一致性和高可用专题、十七
    海量存储之十四、十五
    海量存储系列之十一、十二、十三
    海量存储系列之八、九、十
  • 原文地址:https://www.cnblogs.com/OwenZeng/p/5613209.html
Copyright © 2020-2023  润新知