Apa arti ON [PRIMARY]?

237

Saya membuat skrip pengaturan SQL dan saya menggunakan skrip orang lain sebagai contoh. Berikut ini contoh skripnya:

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

Apakah ada yang tahu apa yang perintah ON [PRIMARY] lakukan?

Icono123
sumber

Jawaban:

248

Ketika Anda membuat database di Microsoft SQL Server, Anda dapat memiliki beberapa grup file, tempat penyimpanan dibuat di banyak tempat, direktori, atau disk. Setiap grup file dapat diberi nama. Grup file PRIMARY adalah grup default, yang selalu dibuat, dan SQL yang Anda berikan membuat tabel Anda PADA grup file PRIMARY.

Lihat MSDN untuk sintaksis lengkap.

blowdart
sumber
153
Ini juga berarti biasanya tidak berguna dan dapat dihapus dengan aman dari skrip.
MGOwen
Ya, dengan cara yang sama Anda bisa menghilangkan inisialisasi variabel ke 0 dan false, karena itu hanya default, kan?
Mark Sowul
12
@MarkSowul Kecuali Anda punya alasan kuat untuk menggunakan ini untuk mengoptimalkan kinerja, ya, tidak masalah untuk mengabaikannya dan membiarkan default terjadi. (Oleh karena itu "biasanya" MGOwen disertakan.) Inisialisasi variabel ke 0atau falseadalah tentang memastikan bahwa kode Anda beroperasi dalam keadaan yang diketahui, yang merupakan masalah logis dan benar dan bukan masalah optimisasi.
jpmc26
3
Saya melihat ON PRIMARYsintaks dua kali dalam skrip - Satu untuk tabel dan satu lagi untuk batasan tabel. Apa artinya jika ada batasan tabel dalam hal penyimpanan? Kedengarannya tidak relevan atau berlebihan bagi saya. Secara sintaksis, seharusnya sudah cukup untuk menyebutkannya sekali pada tingkat tabel atau apakah benar-benar mungkin untuk menyimpan tabel pada grup file PRIMARY dan data batasan tabel pada grup file NON-PRIMARY?
RBT
1
Berikut ini tautan MSDN yang sebenarnya . Yang ada di jawaban tidak lagi berfungsi dan saya tidak dapat mengedit posting!
shekhar
38

Ini merujuk pada filegroup tempat objek yang Anda buat berada. Jadi, grup grup utama Anda dapat berada di drive D: \ dari server Anda. Anda kemudian dapat membuat filegroup lain yang disebut Indeks. Filegroup ini dapat berada di drive E: \ dari server Anda.

pembuat kode
sumber
Apakah ini akan berdampak negatif terhadap kinerja jika saya menyimpan tabel pada grup file PRIMARY dan batasan tabel atau struktur data indeks pada grup file yang berbeda?
RBT
@RBT Ada banyak variabel yang dapat memengaruhi hal ini, dan biasanya banyak jawaban akan dimulai dengan "Itu tergantung tetapi ..." lihat dba.stackexchange.com/questions/2626/… dan pertanyaan terkait
codingbadger
16

ON [PRIMARY] akan membuat struktur pada filegroup "Utama". Dalam hal ini indeks kunci utama dan tabel akan ditempatkan pada grup grup "Utama" dalam database.

Tanda.
sumber
7

Untuk menambahkan catatan yang sangat penting tentang apa yang Mark S. sebutkan di posnya. Dalam SQL Script spesifik yang telah disebutkan dalam pertanyaan Anda tidak akan pernah menyebutkan dua grup file yang berbeda untuk menyimpan baris data Anda dan struktur data indeks.

Alasan mengapa karena fakta bahwa indeks yang dibuat dalam kasus ini adalah Indeks berkerumun di kolom kunci utama Anda. Data indeks berkerumun dan baris data tabel Anda tidak akan pernah berada di grup file yang berbeda .

Jadi jika Anda memiliki dua grup file pada basis data Anda mis. PRIMARY dan SECONDARY maka skrip yang disebutkan di bawah ini akan menyimpan data baris Anda dan mengelompokkan data indeks pada file grup PRIMARY itu sendiri meskipun saya telah menyebutkan grup file yang berbeda ( [SECONDARY]) untuk data tabel . Lebih menarik skrip berjalan dengan sukses juga (ketika saya mengharapkannya untuk memberikan kesalahan karena saya telah memberikan dua grup file yang berbeda: P). SQL Server melakukan trik di belakang layar secara diam-diam dan cerdas.

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

CATATAN: Indeks Anda dapat berada pada grup file yang berbeda HANYA jika indeks yang dibuat bersifat non-cluster .

Script di bawah ini yang membuat indeks non-clustered akan dibuat pada [SECONDARY]grup file sebagai gantinya ketika data tabel sudah berada pada [PRIMARY]grup 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

Anda bisa mendapatkan informasi lebih lanjut tentang bagaimana menyimpan indeks non-cluster di grup file yang berbeda dapat membantu kueri Anda bekerja lebih baik. Inilah salah satu tautannya.

RBT
sumber