ON [PRIMARY] 是啥意思?
Posted
技术标签:
【中文标题】ON [PRIMARY] 是啥意思?【英文标题】:What does ON [PRIMARY] mean?ON [PRIMARY] 是什么意思? 【发布时间】:2011-02-17 09:34:54 【问题描述】:我正在创建一个 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] 命令的作用吗?
【问题讨论】:
【参考方案1】:当您在 Microsoft SQL Server 中创建数据库时,您可以拥有多个文件组,其中在多个位置、目录或磁盘中创建存储。每个文件组都可以命名。 PRIMARY 文件组是默认文件组,它始终被创建,因此您给出的 SQL 会在 PRIMARY 文件组上创建您的表。
有关完整语法,请参阅MSDN。
【讨论】:
这也意味着它通常无用,可以安全地从脚本中删除。 是的,同样的方式你可以省略变量初始化为 0 和 false,因为它只是默认值,对吧? @MarkSowul 除非您有充分的理由使用它来优化性能,否则可以忽略它并让默认值发生。 (因此包括“通常”的 MGOwen。)将变量初始化为0
或 false
是为了确保您的代码在已知状态下运行,这是一个逻辑和正确性问题,而不是优化问题。
我在脚本中看到了两次ON PRIMARY
语法——一次用于表,另一次用于表约束。在存储方面的表约束的情况下意味着什么?这对我来说听起来无关紧要或多余。从语法上讲,在表级别提及一次就足够了,还是真的可以将表存储在 PRIMARY 文件组上,将表约束数据存储在 NON-PRIMARY 文件组上?
这里是实际的MSDN 链接。答案中的那个不再有效,我无法编辑帖子!【参考方案2】:
它指的是您正在创建的对象所在的文件组。因此,您的主文件组可以驻留在服务器的驱动器 D:\ 上。然后,您可以创建另一个名为 Indexes 的文件组。该文件组可以驻留在服务器的 E:\ 驱动器上。
【讨论】:
如果我将表存储在 PRIMARY 文件组上,而表约束或索引数据结构存储在不同的文件组上,是否会对性能产生负面影响? @RBT 有很多变量会影响这一点,通常很多答案都会以“这取决于但...”开头,请参阅dba.stackexchange.com/questions/2626/… 和相关问题【参考方案3】:ON [PRIMARY] 将在“Primary”文件组上创建结构。在这种情况下,主键索引和表将被放置在数据库中的“主”文件组中。
【讨论】:
【参考方案4】:我打算补充Mark S. 的回答,以添加有关文件组的重要说明。
使用 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
您可以获取更多信息here,了解在不同文件组中存储非聚集索引如何提高查询性能
【讨论】:
以上是关于ON [PRIMARY] 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章
MySql里面的 PRIMARY KEY 和 KEY 是啥关系?一个字段即可以是PRIMARY KEY 又可以是 KEY吗?
Mysql Innodb Deadlock on delete with Primary Keys IN 语句
Creating a Physical Standby from Primary on Version 12c (Doc ID 1570958.1)