Que signifie ON [PRIMARY]?

237

Je crée un script de configuration SQL et j'utilise le script de quelqu'un d'autre comme exemple. Voici un exemple du 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

Quelqu'un sait-il ce que fait la commande ON [PRIMARY]?

Icono123
la source

Réponses:

248

Lorsque vous créez une base de données dans Microsoft SQL Server, vous pouvez avoir plusieurs groupes de fichiers, où le stockage est créé à plusieurs endroits, répertoires ou disques. Chaque groupe de fichiers peut être nommé. Le groupe de fichiers PRIMARY est le groupe par défaut, qui est toujours créé, et donc le SQL que vous avez donné crée votre table SUR le groupe de fichiers PRIMARY.

Voir MSDN pour la syntaxe complète.

Blowdart
la source
153
Cela signifie également qu'il est généralement inutile et peut être supprimé en toute sécurité du script.
MGOwen
Oui, de la même manière, vous pouvez simplement omettre les initialisations de variables à 0 et false, car c'est juste la valeur par défaut, non?
Mark Sowul
12
@MarkSowul Sauf si vous avez une bonne raison de l'utiliser pour optimiser les performances, oui, c'est bien de l'omettre et de laisser la valeur par défaut se produire. (D'où le MGOwen «habituellement» inclus.) L'initialisation des variables 0ou le falsefait de s'assurer que votre code fonctionne dans un état connu, ce qui est une préoccupation logique et d'exactitude et non une préoccupation d'optimisation.
jpmc26
3
Je vois la ON PRIMARYsyntaxe deux fois dans le script - une pour la table et une autre pour la contrainte de table. Qu'est-ce que cela signifie en cas de contrainte de table en termes de stockage? Cela me semble hors de propos ou redondant. Syntaxiquement, il aurait dû suffire de le mentionner une fois au niveau de la table ou est-il vraiment possible de stocker la table dans le groupe de fichiers PRIMAIRE et les données de contrainte de table dans le groupe de fichiers NON PRIMAIRE?
RBT
1
Voici le lien MSDN réel . Celui dans la réponse ne fonctionne plus et je ne peux pas modifier le message!
shekhar
38

Il fait référence au groupe de fichiers sur lequel se trouve l'objet que vous créez. Votre groupe de fichiers principal pourrait donc résider sur le lecteur D: \ de votre serveur. vous pouvez ensuite créer un autre groupe de fichiers appelé Index. Ce groupe de fichiers peut résider sur le lecteur E: \ de votre serveur.

codingbadger
la source
Cela aura-t-il un impact négatif sur les performances si je stocke la table dans le groupe de fichiers PRIMAIRE et la contrainte de table ou la structure des données d'index dans un groupe de fichiers différent?
RBT
@RBT Il y a beaucoup de variables qui peuvent affecter cela, et généralement de nombreuses réponses commenceront par "Cela dépend mais ..." voir dba.stackexchange.com/questions/2626/… et les questions connexes
codingbadger
16

ON [PRIMARY] créera les structures sur le groupe de fichiers "Primary". Dans ce cas, l'index de clé primaire et la table seront placés dans le groupe de fichiers "Primaire" de la base de données.

Des marques.
la source
7

Pour ajouter une note très importante sur ce que Mark S. a mentionné dans son article. Dans le script SQL spécifique mentionné dans la question, vous ne pouvez JAMAIS mentionner deux groupes de fichiers différents pour stocker vos lignes de données et la structure des données d'index.

La raison est due au fait que l'index en cours de création dans ce cas est un index clusterisé sur votre colonne de clé primaire. Les données d'index cluster et les lignes de données de votre table ne peuvent JAMAIS se trouver sur différents groupes de fichiers .

Donc, si vous avez deux groupes de fichiers dans votre base de données, par exemple PRIMARY et SECONDARY, le script mentionné ci-dessous stockera vos données de ligne et vos données d'index cluster sur le groupe de fichiers PRIMARY lui-même, même si j'ai mentionné un groupe de fichiers différent ( [SECONDARY]) pour les données de la table . Plus intéressant encore, le script s'exécute avec succès (lorsque je m'attendais à ce qu'il donne une erreur car j'avais donné deux groupes de fichiers différents: P). SQL Server fait le tour de la scène silencieusement et intelligemment.

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

REMARQUE: votre index peut résider sur un groupe de fichiers différent UNIQUEMENT si l'index en cours de création est de nature non groupé .

Le script ci-dessous qui crée un index non clusterisé sera créé sur [SECONDARY]le groupe de fichiers à la place lorsque les données de la table résident déjà sur [PRIMARY]le groupe de fichiers:

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

Vous pouvez obtenir plus d'informations sur la façon dont le stockage d'index non cluster sur un groupe de fichiers différent peut aider vos requêtes à mieux fonctionner. Voici un tel lien.

RBT
la source