Что означает "ВКЛ" в конце запроса? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть запрос, который выглядит примерно так:

...
GO
CREATE TABLE [schema_name].[table_name] (
    [field1] [int] not null,
    [field2] [int] not null,
CONSTRAINT [PK_Some_name] PRIMARY KEY CLUSTERED ([field1] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [CommonData]
) ON [CommonData]
GO
...

Вопрос в том, что такое «ON [CommonData]»? Почему это происходит дважды? В чем смысл этой части и как насчет [CommonData] - это что-то вроде функции по умолчанию или это индивидуальная функция?

1 Ответ

1 голос
/ 09 июля 2020

ON [CommonData] определяет файловую группу , используемую для физического хранения данных.

Синтаксис, который вы используете в вопросе, определяет его как для кластеризованного индекса, так и для таблицы. Однако на самом деле это не две отдельные сущности. Кластерный индекс - это таблица.

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

т.е. Обе попытки ниже возвращают одинаковые результаты

+--------------+------------+
|     name     |    name    |
+--------------+------------+
| PK_Some_name | CommonData |
| ix_field3    | CommonData |
| ix_field2    | CommonData |
+--------------+------------+
drop TABLE if exists dbo.table_name

go

CREATE TABLE dbo.[table_name] (
    [field1] [int] not null,
    [field2] [int] not null,
    [field3] [int] not null INDEX ix_field3,  /*Not specifying filegroup*/
CONSTRAINT [PK_Some_name] PRIMARY KEY CLUSTERED ([field1] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
) ON CommonData

CREATE INDEX ix_field2 ON  dbo.[table_name]([field2]) /*Not specifying filegroup*/

SELECT i.name, ds.name
FROM sys.indexes i
JOIN sys.data_spaces ds on ds.data_space_id = i.data_space_id
WHERE object_id = object_id('dbo.table_name')

GO

drop TABLE if exists dbo.table_name

go

CREATE TABLE dbo.[table_name] (
    [field1] [int] not null,
    [field2] [int] not null,
    [field3] [int] not null INDEX ix_field3,  /*Not specifying filegroup*/
CONSTRAINT [PK_Some_name] PRIMARY KEY CLUSTERED ([field1] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)  ON CommonData
)

CREATE INDEX ix_field2 ON  dbo.[table_name]([field2]) /*Not specifying filegroup*/

SELECT i.name, ds.name
FROM sys.indexes i
JOIN sys.data_spaces ds on ds.data_space_id = i.data_space_id
where object_id = object_id('dbo.table_name')
...