Что означает 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
вы можете получить дополнительную информацию о том, как хранение некластеризованных индексов в другой группе файлов может помочь вашим запросам выступить лучше. здесь является одной из таких ссылок.