ON [PRIMary] nghĩa là gì?


237

Tôi đang tạo tập lệnh thiết lập SQL và tôi đang sử dụng tập lệnh của người khác làm ví dụ. Đây là một ví dụ về tập lệnh:

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

Có ai biết lệnh ON [PRIMARY] không?

Câu trả lời:


248

Khi bạn tạo cơ sở dữ liệu trong Microsoft SQL Server, bạn có thể có nhiều nhóm tệp, nơi lưu trữ được tạo ở nhiều nơi, thư mục hoặc đĩa. Mỗi nhóm tập tin có thể được đặt tên. Nhóm tệp PRIMARY là nhóm mặc định, luôn được tạo và do đó, SQL bạn đã cung cấp sẽ tạo bảng của bạn TRÊN nhóm tệp PRIMARY.

Xem MSDN cho cú pháp đầy đủ.


153
Điều này cũng có nghĩa là nó thường vô dụng và có thể được gỡ bỏ khỏi tập lệnh một cách an toàn .
MGOwen

Có, theo cùng một cách bạn có thể bỏ qua các khởi tạo biến thành 0 và sai, vì đó chỉ là mặc định, phải không?
Đánh dấu Sowul

12
@MarkSowul Trừ khi bạn có lý do chính đáng để sử dụng điều này để tối ưu hóa hiệu suất, vâng, thật tốt khi bỏ qua nó và để mặc định xảy ra. (Do đó bao gồm cả MGOwen "thường".) Khởi tạo các biến thành 0hoặc falselà về việc đảm bảo rằng mã của bạn đang hoạt động ở trạng thái đã biết, đây là mối quan tâm hợp lý và chính xác và không phải là mối quan tâm tối ưu hóa.
jpmc26

3
Tôi thấy ON PRIMARYcú pháp hai lần trong tập lệnh - Một cho bảng và một cho ràng buộc bảng. Nó biểu thị điều gì trong trường hợp ràng buộc bảng về mặt lưu trữ? Nghe có vẻ không liên quan hoặc dư thừa đối với tôi. Về mặt cú pháp, lẽ ra đã đủ để đề cập đến nó một lần ở cấp độ bảng hoặc có thực sự có thể lưu trữ bảng trên nhóm tệp PRIMARY và dữ liệu ràng buộc bảng trên nhóm tệp KHÔNG GIỚI HẠN không?
RBT

1
Đây là liên kết MSDN thực tế . Một trong câu trả lời không còn hoạt động và tôi không thể chỉnh sửa bài viết!
shekhar

38

Nó đề cập đến việc filegroup đối tượng bạn đang tạo nằm trên. Vì vậy, nhóm chính của bạn có thể cư trú trên ổ D: \ của máy chủ của bạn. sau đó bạn có thể tạo một filegroup khác gọi là Indexes. Nhóm này có thể nằm trên ổ E: \ của máy chủ của bạn.


Nó sẽ có tác động hiệu quả tiêu cực nếu tôi lưu trữ bảng trên nhóm tệp PRIMARY và ràng buộc bảng hoặc cấu trúc dữ liệu chỉ mục trên một nhóm tệp khác?
RBT

@RBT Có rất nhiều biến số có thể ảnh hưởng đến điều này và thường thì rất nhiều câu trả lời sẽ bắt đầu bằng "Nó phụ thuộc nhưng ..." xem dba.stackexchange.com/questions/2626/ và các câu hỏi liên quan
codbadger

16

ON [PRIMARY] sẽ tạo các cấu trúc trên filegroup "Chính". Trong trường hợp này, chỉ mục khóa chính và bảng sẽ được đặt trên nhóm tệp "Chính" trong cơ sở dữ liệu.


7

Để thêm một ghi chú rất quan trọng về những gì Mark S. đã đề cập trong bài đăng của mình. Trong Tập lệnh SQL cụ thể đã được đề cập trong câu hỏi, bạn KHÔNG BAO GIỜ đề cập đến hai nhóm tệp khác nhau để lưu trữ các hàng dữ liệu của bạn và cấu trúc dữ liệu chỉ mục.

Lý do là do chỉ mục được tạo trong trường hợp này là một Chỉ mục được nhóm trên cột khóa chính của bạn. Dữ liệu chỉ mục được nhóm và các hàng dữ liệu trong bảng của bạn KHÔNG BAO GIỜ nằm trên các nhóm tệp khác nhau .

Vì vậy, trong trường hợp bạn có hai nhóm tệp trên cơ sở dữ liệu của mình, ví dụ: PRIMARY và THỨ HAI thì tập lệnh được đề cập bên dưới sẽ lưu trữ dữ liệu hàng của bạn và dữ liệu chỉ mục cụm cả trên chính nhóm tệp PRIMARY mặc dù tôi đã đề cập đến một nhóm tệp khác ( [SECONDARY]) cho dữ liệu bảng . Điều thú vị hơn là kịch bản cũng chạy thành công (khi tôi đang mong đợi nó sẽ báo lỗi vì tôi đã đưa ra hai nhóm tệp khác nhau: P). SQL Server thực hiện thủ thuật đằng sau hậu trường một cách âm thầm và thông minh.

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

LƯU Ý: Chỉ mục của bạn có thể nằm trong một nhóm tệp CHỈ nếu chỉ mục được tạo không có cụm .

Tập lệnh bên dưới tạo chỉ mục không được nhóm sẽ được tạo trên [SECONDARY]nhóm tệp thay vì khi dữ liệu bảng đã nằm trong [PRIMARY]nhóm tệp:

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

Bạn có thể nhận thêm thông tin về cách lưu trữ các chỉ mục không được nhóm trên một nhóm tệp khác nhau có thể giúp các truy vấn của bạn hoạt động tốt hơn. Đây là một liên kết như vậy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.