MSSQL_3- 表管理

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43650411/article/details/102645914

目录

  • 表的物理存储方式
  • 表的创建
  • 表的修改
  • 表的删除
  • 临时表


表管理

数据被存储在不同功能的表中,查询围绕着这些表展开。
不能抛开表设计而单独讨论查询优化。eg.一个表的数据量非常大,则可以考虑将其分割为多个表存储,或使用分区表技术,而非完全依赖升级硬件和创建索引来解决。

逻辑上,表由行和列构成,且每列具有一个系统|自定义数据类型。
物理上,表具有两种存储单位:数据页和区。

  • 数据页:最基本的数据存储单位
  • 区:由八个物理上连续的数据页组成(管理数据页)

1.表的物理存储方式

1.1 数据页
  • 大小:8KB(8192字节,8字节/KB,128页/MB,8bit/Byte)
  • 构成:页标头1、数据行、行偏移量2+可用空间

表中每一行最多包含8060字节。如表中包含了text | image数据,当列超过此限制时,数据库引擎将把页中最大宽度的记录列移到另一页,在原始页上保留一个24字节的指针,指向实际存储位置。如后其更新操作使记录变短,记录可能会移回原始页。---- 摘,待验证

日志文件不包含页,而是包含一系列日志记录。

在这里插入图片描述

1.2 区
  • 大小:64KB(8个物理上连续的页,16区/MB)
  • 分类
    • 统一区:由单个对象拥有,所有8页只能由一个对象使用。
    • 混合区:最多由8个对象拥有,每页可由不同对象使用。
  • 分配
    • 通常从混合区向新表或索引分配页,当表增长到8页时,变成统一区进行后续分配。
    • 如对现有表创建索引,且该表包含的行足以在索引中生成8页,则该索引直接使用统一区分配。

2.创建表

表名称在数据库的某个架构3中必须是唯一的。

2.1 创建表
-- 基本表
CREATE TABLE tt1
(
	id  INT,
	name  VARCHAR(20)
)

-- 约束
CREATE TABLE tt2
(
	id INT IDENTITY(1, 1) PRIMARY KEY   -- 自增主键
	name VARCHAR(20) NOT NULL   -- 不允许空值
	GUID uniqueidentifier DEFAULT NEWID()  -- 全球唯一标识符NEWID() | 默认值DEFAULT
)

3.修改表

-- 增加列
ALTER TABLE tt1
ADD sex VARCHAR(10) NOT NULL

-- 修改列
-- 语法
-- changing any part of an object name could break scripts and PROC
sp_rename ’object_name‘, 'new_name', ‘object_type'
-- 列
EXEC sp_rename 'tt1.sex', 'gender', 'COLUMN'

-- 修改列的数据类型
ALTER TABLE tt1 ALTER COLUMN gender VARCHAR(15) NOT NULL  -- 列的大小要合适,否则数据会被截断
ALTER TABLE tt1 ALTER COLUMN gender CHAR(10) NOT NULL
ALTER TABLE tt1 ALTER COLUMN gender CHAR(10)  -- 改为可为空应考虑其它约束

注:删除列之前,必须先删除任何引用该列的约束、默认值表达式、计算列表达式或索引

-- 删除列

-- 检查表中所有约束
EXEC sp_help tt1

-- 删除约束
ALTER TABLE tt1
DROP CONSTRAINT 约束名

-- 删除列
ALTER TABLE tt1
DROP COLUMN gender

-- 删除表内容,保留表结构
DELETE FROM tt1

TRUNCATE TABLE tt1   -- 推荐,效率更佳,资源占用更少

4.删除表

必须先删除FOREIGN KEY约束或引用表

-- 重命名
-- changing any part of an object name could break scripts and PROC
EXEC sp_rename 'tt1', 'tt'

-- 删除表
DROP TABLE tt

5.临时表

永久表存储在它所创建的数据库中,临时表存储在tempdb数据库中。临时表支持除FERGIN KEY约束以外的所有约束定义
应用场景:当必须对临时表显示地创建索引,或多个存储过程,或函数必须使用表值时,临时表很有用。
临时表分为本地表和全局表两种类型:

  • 本地表:单个数字符号(#)打头,仅当前用户可见,当用户从服务器断开连接时被删除
  • 全局表:两个数字符号(##)打头,创建后所有用户可见,当所有引用该表的用户从服务器断开时被删除。

在这里插入图片描述
表变量也是一种临时表。同时,表变量类似于局部变量,有明确的作用域,即声明该变量的函数、存储过程或批处理。
在这里插入图片描述

6.问

6.1 索引和表可以分开存储么?
可以,但不建议。

如果是聚簇索引,该索引本身就是数据以某值的排序,是不能分离的.
其次,哪怕是非聚簇索引,索引本身是为了提高查询速度,只有同数据放在一起才能最大的提高查询速度,分离无论如何怎么都会大大降低效率 — ?待验证.


  1. 页标头使用每页开头的96个字节,存储有关页的系统信息(页码、页类型、页的可用空间、拥有该页的对象的分配单元ID) ↩︎

  2. 偏移量,记录数据行的第1个字节与页标头的距离值,用于区分各数据行。 ↩︎

  3. 表架构属于服务器安全方面的内容。 ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_43650411/article/details/102645914