Was bedeutet ON [PRIMARY]?

237

Ich erstelle ein SQL-Setup-Skript und verwende das Skript eines anderen als Beispiel. Hier ist ein Beispiel für das Skript:

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

Weiß jemand, was der Befehl ON [PRIMARY] bewirkt?

Icono123
quelle

Antworten:

248

Wenn Sie eine Datenbank in Microsoft SQL Server erstellen, können Sie mehrere Dateigruppen haben, in denen Speicher an mehreren Orten, Verzeichnissen oder Datenträgern erstellt wird. Jede Dateigruppe kann benannt werden. Die PRIMARY-Dateigruppe ist die Standarddatei, die immer erstellt wird. Daher erstellt die von Ihnen angegebene SQL Ihre Tabelle in der PRIMARY-Dateigruppe.

Die vollständige Syntax finden Sie unter MSDN .

Blasrohrpfeil
quelle
153
Dies bedeutet auch, dass es normalerweise nutzlos ist und sicher aus dem Skript entfernt werden kann .
MGOwen
Ja, auf die gleiche Weise können Sie Variableninitialisierungen einfach auf 0 und false weglassen, da dies nur die Standardeinstellung ist, oder?
Mark Sowul
12
@MarkSowul Wenn Sie keinen guten Grund haben, dies zur Optimierung der Leistung zu verwenden, ist es in Ordnung, es wegzulassen und die Standardeinstellung zuzulassen. (Daher das "normalerweise" enthaltene MGOwen.) Beim Initialisieren von Variablen 0oder falsewird sichergestellt, dass Ihr Code in einem bekannten Zustand ausgeführt wird . Dies ist ein logisches und korrektes Problem und kein Optimierungsproblem.
jpmc26
3
Ich sehe die ON PRIMARYSyntax zweimal im Skript - eine für die Tabelle und eine für die Tabelleneinschränkung. Was bedeutet es im Falle der Tabellenbeschränkung in Bezug auf die Speicherung? Es klingt für mich irrelevant oder überflüssig. Syntaktisch hätte es ausreichen müssen, es einmal auf Tabellenebene zu erwähnen, oder ist es wirklich möglich, die Tabelle in der PRIMARY-Dateigruppe und die Tabelleneinschränkungsdaten in der NON-PRIMARY-Dateigruppe zu speichern?
RBT
1
Hier ist der aktuelle MSDN- Link. Der in der Antwort funktioniert nicht mehr und ich kann den Beitrag nicht bearbeiten!
Shekhar
38

Es bezieht sich auf die Dateigruppe, in der sich das von Ihnen erstellte Objekt befindet. Ihre primäre Dateigruppe könnte sich also auf Laufwerk D: \ Ihres Servers befinden. Sie können dann eine andere Dateigruppe namens Indizes erstellen. Diese Dateigruppe befindet sich möglicherweise auf Laufwerk E: \ Ihres Servers.

Codierungsbadger
quelle
Wird sich dies negativ auf die Leistung auswirken, wenn ich die Tabelle in einer PRIMARY-Dateigruppe und eine Tabelleneinschränkung oder eine Indexdatenstruktur in einer anderen Dateigruppe speichere?
RBT
@RBT Es gibt viele Variablen, die dies beeinflussen können, und normalerweise beginnen viele Antworten mit "Es kommt darauf an, aber ...", siehe dba.stackexchange.com/questions/2626/… und verwandte Fragen
Codierungsbadger
16

ON [PRIMARY] erstellt die Strukturen in der Dateigruppe "Primary". In diesem Fall werden der Primärschlüsselindex und die Tabelle in der Dateigruppe "Primär" in der Datenbank abgelegt.

Mark S.
quelle
7

Um eine sehr wichtige Anmerkung zu dem hinzuzufügen, was Mark S. in seinem Beitrag erwähnt hat. In dem spezifischen SQL-Skript, das in der Frage erwähnt wurde, können Sie NIEMALS zwei verschiedene Dateigruppen zum Speichern Ihrer Datenzeilen und der Indexdatenstruktur erwähnen.

Der Grund dafür liegt in der Tatsache, dass der in diesem Fall erstellte Index ein Clustered-Index in Ihrer Primärschlüsselspalte ist. Die Clustered-Indexdaten und die Datenzeilen Ihrer Tabelle dürfen sich NIEMALS in verschiedenen Dateigruppen befinden .

Wenn Sie also zwei Dateigruppen in Ihrer Datenbank haben, z. B. PRIMARY und SECONDARY, speichert das unten genannte Skript Ihre Zeilendaten und Clustered-Indexdaten sowohl in der PRIMARY-Dateigruppe selbst, obwohl ich [SECONDARY]für die Tabellendaten eine andere Dateigruppe ( ) erwähnt habe . Interessanter ist, dass das Skript auch erfolgreich ausgeführt wird (als ich erwartet hatte, dass es einen Fehler gibt, da ich zwei verschiedene Dateigruppen angegeben hatte: P). SQL Server erledigt den Trick hinter den Kulissen leise und intelligent.

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

HINWEIS: Ihr Index kann sich NUR in einer anderen Dateigruppe befinden, wenn der erstellte Index nicht gruppiert ist .

Das folgende Skript, das einen nicht gruppierten Index erstellt, wird [SECONDARY]stattdessen für die Dateigruppe erstellt, wenn sich die Tabellendaten bereits in der [PRIMARY]Dateigruppe befinden:

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

Sie können weitere Informationen darüber erhalten, wie das Speichern von nicht gruppierten Indizes in einer anderen Dateigruppe die Leistung Ihrer Abfragen verbessern kann. Hier ist ein solcher Link.

RBT
quelle