Tables

适用于:SQL Server 2016 (13.x)及更高版本 Azure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终端Microsoft Fabric 中的仓库Microsoft Fabric 中的 SQL 数据库

表是包含数据库中所有数据的数据库对象。 数据在表中的逻辑组织方式与在电子表格中相似,都是按行和列的格式组织的。 每一行代表一条唯一的记录,每一列代表记录中的一个字段。 例如,在包含公司雇员数据的表中,每一行代表一名雇员,各列分别代表该雇员的信息,如雇员编号、姓名、地址、职位以及家庭电话号码等。

  • 数据库中的表数仅受数据库中允许的对象数 (2,147,483,647) 的限制。 标准的用户定义的表可以有多达 1024 列。 表的行数仅受服务器的存储容量的限制。

  • 您可将属性分配到表和表中的每个列以控制允许的数据和其他属性。 例如,您可在列上创建约束以禁止空值或在未指定值时提供默认值,您也可以在表上指定强制唯一性或定义表之间的关系的键约束。

  • 可对表中的数据按行或页进行压缩。 通过数据压缩,可在页上存储更多的行。 有关详细信息,请参阅 数据压缩

表类型

除了基本用户定义表的标准角色以外,SQL Server 还提供了下列类型的表,这些表在数据库中起着特殊的作用。

分区表

分区表是将数据水平划分为可以分布在数据库中多个文件组的“数据单位”的表。 在维护整个集合的完整性时,使用分区可以快速而有效地访问或管理数据子集,从而使大型表或索引更易于管理。 默认情况下,SQL Server 支持多达 15,000 个分区。 有关详细信息,请参阅已分区表和已分区索引

临时表

临时表存储在 tempdb. 有两种类型的临时表: 本地 表和 全局表。 它们在名称、可见性以及可用性上有区别。

  • 本地临时表(也称为会话范围的临时表)具有单一数字符号(#)作为其名称的第一个字符;它们仅对用户的当前连接可见,当用户与 SQL Server 实例断开连接时,它们将被删除。
  • 全局临时表具有两个数字符号(##)作为其名称的第一个字符;创建后对任何用户可见,并且当引用表的所有用户与 SQL Server 实例断开连接时,它们将被删除。

在 Fabric 数据仓库中,仅支持会话范围的临时表,不受时间旅行提示的影响。

减少了在多个作用域中使用临时表的工作负载的重新编译次数

在所有数据库兼容级别下,SQL Server 2019 (15.x) 都可减少对跨多个作用域使用临时表的工作负载的重新编译次数。 Azure SQL 数据库也在数据库兼容性级别 150 下针对所有部署模型启用了此功能。 在推出此功能之前,当引用带有数据操作语言 DML 语句(SELECTINSERTUPDATEDELETE)的临时表时,如果此临时表由外部作用域批处理创建,则会导致每次执行时都会重新编译 DML 语句。 借助此改进,SQL Server 可执行其他轻量级检查来避免不必要的重新编译:

  • 检查在编译时用于创建临时表的外部作用域模块是否与用于连续执行的外部作用域模块相同。
  • 跟踪在初始编译时所做的任何数据定义语言 (DDL) 更改,并将它们与连续执行的 DDL 操作进行比较。

最终结果是减少了无关的重新编译和 CPU 开销。

系统表

SQL Server 将定义服务器配置及其所有表的数据存储在一组特殊的表中,这组表称为系统表。 用户不能直接查询或更新系统表。 可以通过系统视图查看系统表中的信息。 有关列表,请参阅系统表(Transact-SQL)。

宽表

宽表使用 稀疏列 ,从而将表可以包含的总列数增大为 30,000 列。 稀疏列是对 null 值进行了优化存储的普通列。 稀疏列减少了空值所需的存储空间,但代价是检索非空值时的开销更大。 宽表已定义了一个 列集,列集是一种非类型化的 XML 表示形式,它将表的所有稀疏列合并为一种结构化的输出。 索引数和统计信息数也分别增大为 1,000 和 30,000。 宽表行的最大大小为 8,019 个字节。 因此,任何特定行中的大多数数据都应为 NULL。 宽表中非稀疏列和计算列的列数之和仍不得超过 1,024。

宽表会对性能产生以下影响。

  • 宽表会增加维护表上索引的开销。 我们建议将宽表的索引数限制为业务逻辑所需的索引数。 索引数增加,DML 编译时和内存需求也会增加。 非聚集索引应当为应用到数据子集的筛选索引。 有关详细信息,请参阅 “创建筛选索引”。

  • 应用程序可以在宽表中动态添加和删除列。 当添加或删除列时,已编译的查询计划也将作废。 我们建议您设计与预定工作负荷相匹配的应用程序,以便使架构更改降至最少。

  • 当在宽表中添加和删除数据时,性能会受到影响。 必须为投影工作负荷设计应用程序,以便尽量减少对表数据的更改。

  • 限制在宽表上执行更新聚类键多行的 DML 语句。 编译和执行这些语句会需要非常多的内存资源。

  • 对宽表执行分区切换操作可能很慢,而且处理时可能需要大量内存。 性能和内存需求与源分区和目标分区中的列数成比例。

  • 用于更新宽表中特定列的游标应在 FOR UPDATE 子句中显式列出这些列。 这将有助于优化使用游标时的性能。

常见表任务

下表提供指向与创建或修改表相关的常见任务的链接。

表任务 Topic
介绍如何创建表。 创建表(数据库引擎)
介绍如何删除表。 删除表(数据库引擎)
介绍如何创建一个新表,其中包含现有表中的部分列或全部列。 重复表
介绍如何重命名表。 重命名表(数据库引擎)
介绍如何查看表的属性。 查看表定义
介绍如何确定诸如视图或存储过程等其他对象是否取决于表。 查看表的依赖项

下表提供指向与创建或修改表中的列相关的常见任务的链接。

列任务 Topic
介绍如何向现有表中添加列。 向表中添加列(数据库引擎)
介绍如何从表中删除列。 从表中删除列
描述如何更改列的名称。 重命名列(数据库引擎)
介绍如何通过仅复制列定义或者复制定义和数据将列从一个表复制到另一个表。 将列从一个表复制到另一个表(数据库引擎)
介绍如何通过更改数据类型或其他属性来修改列定义。 修改列
介绍如何更改列的显示顺序。 更改表中的列顺序
介绍如何在表中创建计算列。 在表中指定计算列
介绍如何指定列的默认值。 如果未提供其他值,则使用此值。 指定列的默认值