2010-05-09 12 views
169

Sto creando uno script di installazione SQL e sto usando lo script di qualcun altro come esempio. Ecco un esempio dello script:Che cosa 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 

Qualcuno sa cosa fa il comando ON [PRIMARY]?

risposta

182

Quando si crea un database in Microsoft SQL Server è possibile avere più gruppi di file, in cui lo spazio di archiviazione viene creato in più posizioni, directory o dischi. Ogni gruppo di file può essere nominato. Il gruppo di file PRIMARY è quello predefinito, che viene sempre creato, quindi l'SQL fornito crea la tabella sul gruppo di file PRIMARY.

Vedere MSDN per la sintassi completa.

+115

Ciò significa anche che di solito è ** inutile e può essere rimosso in sicurezza ** dallo script. – MGOwen

+0

Sì, allo stesso modo puoi semplicemente omettere le inizializzazioni delle variabili su 0 e false, perché è solo l'impostazione predefinita, giusto? –

+9

@MarkSowul A meno che non si abbia una buona ragione per usarlo per ottimizzare le prestazioni, sì, va bene ometterlo e lasciare che avvenga il default. (Da qui il "solito" MGOwen incluso). Inizializzare le variabili a '0' o' false' significa assicurarsi che il tuo codice funzioni in uno stato conosciuto, che è un problema logico e di correttezza e non un problema di ottimizzazione. – jpmc26

11

ON [PRIMARY] creerà le strutture nel filegroup "Primario". In questo caso, l'indice della chiave primaria e la tabella verranno posizionati nel filegroup "Primario" all'interno del database.

26

Si riferisce a quale filegroup risiede l'oggetto che si sta creando. Quindi il filegroup primario potrebbe risiedere sull'unità D: \ del tuo server. potresti quindi creare un altro filegroup chiamato Indexes. Questo filegroup potrebbe risiedere sull'unità E: \ del tuo server.

+3

upvoted per un esempio del mondo reale invece di RTFM – JumpingJezza

+0

Avrà un impatto negativo sulle prestazioni se memorizzo la tabella sul gruppo di file PRIMARY e sul vincolo di tabella o sulla struttura di dati dell'indice su un gruppo di file diverso? – RBT

+0

@RBT Ci sono molte variabili che possono influenzare questo, e in genere molte risposte inizieranno con "Dipende ma ..." vedi http: //dba.stackexchange.it/questions/2626/when-should-nonclustered-indexes-be-stored-on-separate-filegroups e domande correlate – codingbadger

3

Per aggiungere una nota molto importante su ciò che Mark S. ha menzionato nel suo post. Nello specifico script SQL che è stato menzionato nella domanda, non è MAI possibile menzionare due diversi gruppi di file per l'archiviazione delle righe di dati e la struttura dei dati dell'indice.

Il motivo è dovuto al fatto che l'indice creato in questo caso è un indice cluster sulla colonna della chiave primaria. I dati di indice cluster e le righe di dati della tabella non possono MAI essere su gruppi di file diversi.

Quindi nel caso in cui nel database ci siano due gruppi di file, ad es. Lo script PRIMARY e SECONDARY quindi sotto menzionato memorizzerà i dati di riga e i dati dell'indice cluster sia sul gruppo di file PRIMARY stesso anche se ho menzionato un gruppo di file diverso ([SECONDARY]) per i dati della tabella. Più interessante anche lo script viene eseguito correttamente (quando mi aspettavo che desse un errore dato che avevo dato due diversi gruppi di file: P). SQL Server fa il trucco dietro la scena in modo silenzioso e intelligente.

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: L'indice può risiedere su un gruppo di file diversa solo se l'indice è stato creato non in cluster di natura.

Lo script di sotto del quale crea un indice non cluster otterrà creato su [SECONDARY] gruppo di file, invece, quando i dati della tabella si trova già sul gruppo [PRIMARY] del file:

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 

È possibile ottenere ulteriori informazioni su come la memorizzazione non indici raggruppati su un gruppo di file diverso possono aiutare le tue query a ottenere risultati migliori. Here è uno di questi link.