我正在创建一个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]命令是做什么的吗?


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

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