ON [PRIMARY]是什么意思?

我正在创建一个SQL设置脚本,我正在使用别人的脚本作为示例。下面是一个脚本示例:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[be_Categories](
[CategoryID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_be_Categories_CategoryID]  DEFAULT (newid()),
[CategoryName] [nvarchar](50) NULL,
[Description] [nvarchar](200) NULL,
[ParentID] [uniqueidentifier] NULL,
CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED
(
[CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

有人知道ON [PRIMARY]命令是做什么的吗?

158326 次浏览

ON [PRIMARY]将在“PRIMARY”文件组上创建结构。在这种情况下,主键索引和表将被放在数据库中的“primary”文件组中。

它指的是要创建的对象所在的文件组。因此,您的主文件组可以驻留在您服务器的D:\驱动器上。然后可以创建另一个名为Indexes的文件组。该文件组可以驻留在服务器的E:\驱动器上。

当您在Microsoft SQL Server中创建数据库时,您可以有多个文件组,其中存储将创建在多个位置、目录或磁盘中。每个文件组都可以被命名。PRIMARY文件组是默认的,它总是被创建,因此您提供的SQL在PRIMARY文件组上创建表。

完整的语法参见MSDN

我打算补充马克。的回答,添加一个关于文件组的重要注意事项。

使用OP的SQL脚本,你可以从来没有提到两个不同的文件组,即一个用于存储数据行,另一个用于索引数据结构。这是不允许的。

这是因为在本例中创建的索引是主键列上的聚集索引。聚集索引的元数据和表的数据行永远不能是两个不同的文件组

如果你的数据库中有两个文件组,例如PRIMARY和SECONDARY,那么下面提到的脚本将把你的行数据和聚集索引数据都存储在PRIMARY文件组本身,尽管我已经提到了一个不同的文件组([SECONDARY])用于表数据。

CREATE TABLE [dbo].[be_Categories](
[CategoryID] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [DF_be_Categories_CategoryID]  DEFAULT (newid()),
[CategoryName] [nvarchar](50) NULL,
[Description] [nvarchar](200) NULL,
[ParentID] [uniqueidentifier] NULL,
CONSTRAINT [PK_be_Categories] PRIMARY KEY CLUSTERED
(
[CategoryID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [SECONDARY]
GO

更有趣的是,上面的脚本运行到完成时没有出现任何错误(我预计会出现错误,因为我给出了两个不同的文件组)。SQL Server在幕后默默完成这个任务,不会抛出任何错误。

注意:但是,在非聚集索引的情况下,索引可以位于不同的文件组上

下面所示的SQL脚本创建了一个非聚集索引。非聚集索引将创建在[SECONDARY]文件组中,而表数据则位于[PRIMARY]文件组中:

CREATE NONCLUSTERED INDEX [IX_Categories] ON [dbo].[be_Categories]
(
[CategoryName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Secondary]
GO

你可以获得更多关于在不同的文件组中存储非聚集索引如何提高查询性能的信息在这里