2010-05-09 42 views
169

Estoy creando un script de instalación de SQL y estoy usando el script de otra persona como ejemplo. Aquí hay un ejemplo del script:¿Qué significa ON [PRIMARY]?

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]?

Respuesta

182

Cuando crea una base de datos en Microsoft SQL Server puede tener varios 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 PRIMARIO es el predeterminado, que siempre se crea, por lo que el SQL que ha dado crea su tabla EN el grupo de archivos PRIMARIO.

Consulte MSDN para obtener la sintaxis completa.

+115

Esto también significa que usualmente es ** inútil y se puede eliminar de forma segura ** del script. – MGOwen

+0

Sí, de la misma manera puedes omitir las inicializaciones de variables a 0 y falso, porque es solo el predeterminado, ¿verdad? –

+9

@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. (De ahí el MGO incluido "generalmente".) Inicializar las variables a '0' o 'falso' es sobre asegurar que su código esté operando en un estado conocido, lo cual es una preocupación lógica y de corrección y no una preocupación de optimización. – jpmc26

11

ON [PRIMARIO] creará las estructuras en el grupo de archivos "Principal". 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.

26

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

+3

upvoted para un ejemplo del mundo real en lugar de RTFM – JumpingJezza

+0

¿Tendrá un impacto negativo en el rendimiento si almaceno la tabla en el grupo de archivos PRIMARIO y la restricción de tabla o estructura de datos de índice en un grupo de archivos diferente? – RBT

+0

@RBT Hay muchas variables que pueden afectar esto, y generalmente muchas respuestas comenzarán con "Depende pero ..." ver http: //dba.stackexchange.com/questions/2626/when-should-noclustered-indexes-be-stored-on-separate-filegroups y preguntas relacionadas – codingbadger

3

Para agregar una nota muy importante sobre lo que Mark S. ha mencionado en su publicación. En el SQL Script 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 del índice.

La razón por la cual se debe al hecho de que el índice que se está creando en este caso es un índice agrupado en su columna de clave principal. Los datos del índice agrupado 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, p. Las secuencias de comandos PRIMARIO y SECUNDARIO y las que se mencionan a continuación almacenarán los datos de la fila y los datos del índice agrupado en el grupo de archivos PRIMARIO aunque haya mencionado un grupo de archivos diferente ([SECONDARY]) para los datos de la tabla. Lo que es más interesante, el script también se ejecuta correctamente (cuando esperaba que diera un error, ya que había dado dos grupos de archivos diferentes: P). SQL Server hace el truco detrás de la 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 diferentes sólo si el índice está creando es no agrupado en la naturaleza.

El siguiente script que crea un índice no agrupado será creado en [SECONDARY] grupo de archivos en lugar cuando los datos de la tabla ya reside en el grupo [PRIMARY] archivo:

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 no los índices agrupados en un grupo de archivos diferente pueden ayudar a que sus consultas rindan mejor. Here es uno de esos enlaces.