关于SQL建表语句中两处ON [CommonData]的含义及相关疑问
解析CREATE TABLE语句中的
ON [CommonData] 我来帮你拆解这条SQL里的ON [CommonData]细节,刚好对SQL Server的文件组机制比较熟:
1. ON [CommonData]是什么?
这是SQL Server专属的文件组指定子句。文件组是数据库的逻辑存储单元,它可以关联一个或多个物理数据文件(比如.ndf格式的次要数据文件),用来把数据分散到不同的磁盘位置,方便性能优化和数据管理。
2. 为什么会出现两次?
这两次的作用对象完全不同:
- 第一次跟在聚集主键约束的
WITH配置后面:WITH (...) ON [CommonData]
这里是专门指定**聚集索引(也就是这个主键索引)**的存储文件组。因为你定义的是PRIMARY KEY CLUSTERED,聚集索引的叶子节点就是表的实际数据行,但这里显式指定后,整个聚集索引(包括关联的数据)都会存在CommonData文件组里。 - 第二次跟在整个CREATE TABLE语句的末尾:
ON [CommonData]
这里是指定表本身的数据行默认的存储文件组。如果没有给聚集索引单独指定文件组,表的数据会默认使用这个位置;你这里给聚集索引也指定了同一个文件组,所以最终表数据和主键索引都会存在CommonData里。
3. 这个子句的核心作用?
说白了就是灵活控制数据的物理存储位置,常见的使用场景:
- 把大型表/高频访问的索引放到SSD磁盘上,大幅提升查询性能;
- 按业务模块分类存储数据,方便单独备份/恢复某个文件组(比如只备份业务数据文件组,不用碰系统表);
- 分散磁盘IO压力,避免单个磁盘因为读写量过大成为性能瓶颈。
4. [CommonData]是默认还是自定义?
这是完全自定义的文件组,不是SQL Server的默认特性。SQL Server新建数据库时,默认只有一个PRIMARY文件组。如果没有提前在目标数据库中创建CommonData文件组,执行这条CREATE TABLE语句会直接报错。创建这个文件组的示例语句如下:
-- 先添加文件组 ALTER DATABASE YourTargetDatabaseName ADD FILEGROUP CommonData; -- 再给文件组添加物理数据文件 ALTER DATABASE YourTargetDatabaseName ADD FILE ( NAME = CommonDataFile, FILENAME = 'D:\SQLData\YourDB_CommonData.ndf', SIZE = 100MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10% ) TO FILEGROUP CommonData;
内容的提问来源于stack exchange,提问作者Bakerelly
相关产品推荐
相关产品推荐

