¿Qué significa ON [PRIMARIO]?

237

Estoy creando un script de configuración de SQL y estoy usando el script de otra persona como ejemplo. Aquí hay un ejemplo del guión:

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

¿Alguien sabe lo que hace el comando ON [PRIMARY]?

Icono123
fuente

Respuestas:

248

Cuando crea una base de datos en Microsoft SQL Server, puede tener múltiples grupos de archivos, donde el almacenamiento se crea en múltiples lugares, directorios o discos. Cada grupo de archivos puede ser nombrado. El grupo de archivos PRIMARY es el predeterminado, que siempre se crea, por lo que el SQL que ha proporcionado crea su tabla EN el grupo de archivos PRIMARY.

Ver MSDN para la sintaxis completa.

soplar el dardo
fuente
153
Esto también significa que generalmente es inútil y se puede eliminar de forma segura del script.
MGOwen
Sí, de la misma manera, puede omitir las inicializaciones variables a 0 y falso, porque es solo el valor predeterminado, ¿verdad?
Mark Sowul
12
@ MarkSowul A menos que tenga una buena razón para usar esto para optimizar el rendimiento, sí, está bien omitirlo y dejar que ocurra lo predeterminado. (Por lo tanto, se incluye el MGOwen "generalmente"). Inicializar variables 0o falsegarantizar que su código está funcionando en un estado conocido, lo cual es un problema de lógica y corrección y no un problema de optimización.
jpmc26
3
Veo la ON PRIMARYsintaxis dos veces en el script: una para la tabla y otra para la restricción de la tabla. ¿Qué significa en el caso de la restricción de la tabla en términos de almacenamiento? Suena irrelevante o redundante para mí. Sintácticamente, debería haber sido suficiente mencionarlo una vez a nivel de tabla o ¿es realmente posible almacenar la tabla en el grupo de archivos PRIMARIO y los datos de restricción de tabla en el grupo de archivos NO PRIMARIO?
RBT
1
Aquí está el enlace real de MSDN . ¡El de la respuesta ya no funciona y no puedo editar la publicación!
shekhar
38

Se refiere a qué grupo de archivos reside el objeto que está creando. Por lo tanto, su grupo de archivos primario podría residir en la unidad D: \ de su servidor. entonces podría crear otro grupo de archivos llamado Índices. Este grupo de archivos podría residir en la unidad E: \ de su servidor.

codingbadger
fuente
¿Tendrá un impacto negativo en el rendimiento si almaceno la tabla en el grupo de archivos PRIMARY y la restricción de la tabla o la estructura de datos de índice en un grupo de archivos diferente?
RBT
@RBT Hay muchas variables que pueden afectar esto, y por lo general muchas respuestas comenzarán con "Depende pero ..." ver dba.stackexchange.com/questions/2626/… y preguntas relacionadas
codingbadger
16

ON [PRIMARIO] creará las estructuras en el grupo de archivos "Primario". En este caso, el índice de clave principal y la tabla se colocarán en el grupo de archivos "Principal" dentro de la base de datos.

Marcas.
fuente
7

Para agregar una nota muy importante sobre lo que Mark S. ha mencionado en su publicación. En el Script SQL específico que se ha mencionado en la pregunta, NUNCA puede mencionar dos grupos de archivos diferentes para almacenar sus filas de datos y la estructura de datos de índice.

La razón se debe al hecho de que el índice que se crea en este caso es un índice agrupado en su columna de clave principal. Los datos de índice agrupados y las filas de datos de su tabla NUNCA pueden estar en diferentes grupos de archivos .

Entonces, en caso de que tenga dos grupos de archivos en su base de datos, por ejemplo, PRIMARY y SECONDARY, el script mencionado a continuación almacenará sus datos de fila y datos de índice agrupados tanto en el grupo de archivos PRIMARY como en el caso de que haya mencionado un grupo de archivos diferente ( [SECONDARY]) para los datos de la tabla . Lo más interesante es que el script también se ejecuta con éxito (cuando esperaba que produjera un error, ya que había dado dos grupos de archivos diferentes: P). SQL Server hace el truco detrás de escena silenciosa e inteligentemente.

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: Su índice puede residir en un grupo de archivos diferente SOLO si el índice que se está creando no es de naturaleza agrupada .

El siguiente script que crea un índice no agrupado se creará en [SECONDARY]el grupo de archivos cuando los datos de la tabla ya residen en [PRIMARY]el grupo de archivos:

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

Puede obtener más información sobre cómo almacenar índices no agrupados en un grupo de archivos diferente puede ayudar a que sus consultas funcionen mejor. Aquí hay uno de esos enlaces.

RBT
fuente