我正在创建一个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]命令是做什么的吗?
请注意与文件组相关的一个重要行为。
使用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
您可以在这里获得有关在不同的文件组上存储非聚集索引如何提高查询性能的更多信息。