ON [PRIMARY]是什么意思?


237

我正在创建一个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]命令的作用吗?

Answers:


248

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

有关完整语法,请参见MSDN


153
这也意味着它通常是无用的,可以安全地从脚本中删除
MGOwen'3

是的,您可以通过相同的方式将变量初始化省略为0和false,因为这只是默认设置,对吗?
Mark Sowul 2013年

12
@MarkSowul除非您有充分的理由使用它来优化性能,否则,可以忽略它并让默认值发生是很好的。(因此包括“通常”的MGOwen。)将变量初始化为0false关于确保代码以已知状态运行的问题,这是逻辑和正确性的考虑,而不是优化的考虑。
jpmc26 2015年

3
ON PRIMARY在脚本中两次看到了语法-一种用于表,另一种用于表约束。在存储方面存在表约束的情况下,这意味着什么?对我来说,这听起来无关紧要或多余。从语法上讲,在表级别仅提及一次就足够了,还是真的有可能将表存储在PRIMARY文件组中并将表约束数据存储在NON-PRIMARY文件组中?
RBT

1
这是实际的MSDN链接。答案中的那个不再有效,我无法编辑帖子!
shekhar

38

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


如果将表存储在PRIMARY文件组上并将表约束或索引数据结构存储在其他文件组上,会对性能产生负面影响吗?
RBT

@RBT有很多变量可以影响这一点,通常很多答案,将“这取决于但是......”看到开始的dba.stackexchange.com/questions/2626/...及相关问题
codingbadger

16

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


7

对于Mark S.在他的帖子中提到的内容,要添加非常重要的注释。在问题中提到的特定SQL脚本中,您永远不能提及两个不同的文件组来存储数据行和索引数据结构。

之所以这样,是因为在这种情况下创建的索引是主键列上的聚集索引。聚集索引数据和表的数据行永远不能位于不同的文件组上

因此,如果您的数据库上有两个文件组(例如PRIMARY和SECONDARY),那么即使我[SECONDARY]为表数据提到了一个不同的文件组(),下面提到的脚本也会在PRIMARY文件组本身上存储行数据和聚簇索引数据。更有趣的是,脚本也可以成功运行(当我期望它给出错误时,就像我给了两个不同的文件组:P一样)。SQL Server悄无声息地巧妙地解决了幕后的难题。

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

注意:仅当创建的索引本质上非集群时,您的索引才能驻留在不同的文件组上

[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

您可以获取有关如何将非聚集索引存储在不同文件组上的更多信息,以帮助您更好地执行查询。是一个这样的链接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.