O que significa ON [PRIMARY]?


237

Estou criando um script de instalação do SQL e estou usando o script de outra pessoa como exemplo. Aqui está um exemplo do script:

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

Alguém sabe o que o comando ON [PRIMARY] faz?

Respostas:


248

Ao criar um banco de dados no Microsoft SQL Server, você pode ter vários grupos de arquivos, nos quais o armazenamento é criado em vários locais, diretórios ou discos. Cada grupo de arquivos pode ser nomeado. O grupo de arquivos PRIMARY é o padrão, que é sempre criado; portanto, o SQL que você forneceu cria sua tabela no grupo de arquivos PRIMARY.

Veja MSDN para a sintaxe completa.


153
Isso também significa que geralmente é inútil e pode ser removido com segurança do script.
precisa saber é o seguinte

Sim, da mesma maneira, você pode simplesmente omitir as inicializações de variáveis ​​para 0 e false, porque é apenas o padrão, certo?
precisa saber é o seguinte

12
@ MarkSowul A menos que você tenha um bom motivo para usá-lo para otimizar o desempenho, sim, não há problema em omitir e deixar o padrão acontecer. (Daí o "normalmente" MGOwen incluído.) Inicializar variáveis para 0ou false-se de garantir que seu código está operando em um estado conhecido, que é uma preocupação lógica e correção e não uma preocupação de otimização.
Jpmc26

3
Eu vejo a ON PRIMARYsintaxe duas vezes no script - um para a tabela e outro para a restrição de tabela. O que isso significa no caso da restrição de tabela em termos de armazenamento? Parece irrelevante ou redundante para mim. Sintaticamente, deveria ter sido suficiente mencioná-la uma vez no nível da tabela ou é realmente possível armazenar a tabela no grupo de arquivos PRIMARY e dados de restrição de tabela no grupo de arquivos NÃO-PRIMARY?
RBT

1
Aqui está o link real do MSDN . O da resposta não funciona mais e não consigo editar a postagem!
shekhar

38

Refere-se a qual grupo de arquivos o objeto em que você está criando reside. Portanto, seu grupo de arquivos principal pode residir na unidade D: \ do seu servidor. você pode criar outro grupo de arquivos chamado índices. Este grupo de arquivos pode residir na unidade E: \ do seu servidor.


Isso terá um impacto negativo no desempenho se eu armazenar a tabela no grupo de arquivos PRIMARY e a restrição de tabela ou estrutura de dados de índice em um grupo de arquivos diferente?
RBT

@RBT Há muitas variáveis que podem afetar esta, e, geralmente, muitas respostas começam com "Depende mas ..." ver dba.stackexchange.com/questions/2626/... e outras questões relacionadas
codingbadger

16

ON [PRIMARY] criará as estruturas no grupo de arquivos "Primário". Nesse caso, o índice da chave primária e a tabela serão colocados no grupo de arquivos "Primário" no banco de dados.


7

Para adicionar uma nota muito importante sobre o que Mark S. mencionou em seu post. No script SQL específico mencionado na pergunta, NUNCA é possível mencionar dois grupos de arquivos diferentes para armazenar suas linhas de dados e a estrutura de dados do índice.

O motivo disso se deve ao fato de o índice que está sendo criado nesse caso ser um índice agrupado em sua coluna de chave primária. Os dados do índice clusterizado e as linhas de dados da sua tabela NUNCA podem estar em diferentes grupos de arquivos .

Portanto, caso você tenha dois grupos de arquivos no seu banco de dados, por exemplo, PRIMARY e SECONDARY, o script abaixo mencionado armazenará seus dados de linha e dados de índice em cluster no próprio grupo de arquivos PRIMARY, embora eu tenha mencionado um grupo de arquivos diferente ( [SECONDARY]) para os dados da tabela . O mais interessante é que o script também é executado com êxito (quando eu esperava que desse um erro, como havia dado dois grupos de arquivos diferentes: P). O SQL Server faz o truque nos bastidores de maneira silenciosa e inteligente.

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

NOTA: Seu índice pode residir apenas em um grupo de arquivos diferente se o índice que está sendo criado não tiver um cluster de natureza .

O script abaixo que cria um índice não agrupado em cluster será criado no [SECONDARY]grupo de arquivos, quando os dados da tabela já residirem no [PRIMARY]grupo de arquivos:

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

Você pode obter mais informações sobre como o armazenamento de índices não agrupados em cluster em um grupo de arquivos diferente pode ajudar no desempenho de suas consultas. Aqui está um desses links.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.