Sql 在[小学]上是什么意思?

Sql 在[小学]上是什么意思?,sql,sql-server,database,database-design,Sql,Sql Server,Database,Database Design,我正在创建一个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()), [Cate

我正在创建一个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”文件组上创建结构。在这种情况下,主键索引和表将放在数据库中的“主”文件组上。

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

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


有关完整语法,请参阅。

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

原因是,在本例中创建的索引是主键列上的聚集索引聚集索引数据和表中的数据行不能位于不同的文件组上

因此,如果数据库中有两个文件组,例如主文件组和次文件组,那么下面提到的脚本将在主文件组本身上存储行数据和聚集索引数据,即使我提到了表数据的不同文件组(
[SECONDARY]
)。更有趣的是,脚本也成功地运行了(当我希望它给出一个错误时,因为我给出了两个不同的文件组:P)。SQLServer在幕后默默而巧妙地完成了这一任务

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
注意:只有在创建的索引本质上是非聚集索引时,您的索引才能驻留在不同的文件组上

当表数据已经驻留在
[PRIMARY]
文件组中时,将在
[SECONDARY]
文件组上创建以下创建非聚集索引的脚本:

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

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

这也意味着它通常是无用的,可以安全地从脚本中删除。是的,同样,您可以忽略变量初始化为0和false,因为这只是默认值,对吗?@MarkSowul除非您有充分的理由使用它来优化性能,是的,忽略它并让默认值发生是可以的。(因此包括“通常”)将变量初始化为
0
false
是为了确保代码在已知状态下运行,这是一个逻辑和正确性方面的问题,而不是优化方面的问题。我在脚本中看到了两次主语法,一次用于表,另一次用于表约束。在存储方面,表约束意味着什么?这听起来与我无关或多余。从语法上讲,在表级别只提及一次就足够了,还是真的可以将表存储在主文件组上,而将表约束数据存储在非主文件组上?以下是实际链接。答案中的那个不再有效,我无法编辑帖子!如果我将表存储在主文件组上,并将表约束或索引数据结构存储在其他文件组上,会对性能产生负面影响吗?@RBT有很多变量会影响这一点,通常很多答案都以“这取决于…”开头,请参阅和相关问题