Что означает ON [PRIMARY]?

Я создаю сценарий установки 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]?

4 ответов


при создании базы данных в Microsoft SQL Server можно иметь несколько файловых групп, в которых хранилище создается в нескольких местах, каталогах или дисках. Каждая группа файлов может быть названа. Основная группа файлов-это группа по умолчанию, которая всегда создается, и поэтому SQL, который вы дали, создает таблицу в основной группе файлов.

посмотреть MSDN для полного синтаксиса.


Это относится к какой файловой группе находится объект, который вы создаете. Таким образом, ваша основная файловая группа может находиться на диске D:\ вашего сервера. затем можно создать другую файловую группу, называемую индексами. Эта файловая группа может находиться на диске E:\ вашего сервера.


ON [PRIMARY] создаст структуры в" первичной " файловой группе. В этом случае индекс первичного ключа и таблица будут помещены в "первичную" файловую группу в базе данных.


добавить очень важное замечание о том, что Марк С. упомянул в своем посте. В конкретном сценарии SQL, упомянутом в вопросе, вы никогда не можете упомянуть две разные группы файлов для хранения строк данных и структуры данных индекса.

причина в том, что индекс, создаваемый в этом случае, является кластеризованным индексом в столбце первичного ключа. данные кластеризованного индекса и строки данных таблицы никогда не могут находиться в разных файлах группы.

поэтому, если у вас есть две группы файлов в вашей базе данных, например, первичный и вторичный, то ниже упомянутый скрипт будет хранить ваши данные строк и кластеризованные индексные данные как в самой первичной файловой группе, даже если я упомянул другую файловую группу ([SECONDARY]) для данных табл. Более интересно, что скрипт работает успешно (когда я ожидал, что он выдаст ошибку, поскольку я дал две разные группы файлов :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

вы можете получить дополнительную информацию о том, как хранение некластеризованных индексов в другой группе файлов может помочь вашим запросам выступить лучше. здесь является одной из таких ссылок.