2010-05-09 29 views
169

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ụ. Dưới đây là ví dụ về tập lệnh:ON [PRIMARY] có nghĩa là gì?

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] có làm gì không?

Trả lời

182

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, nó luôn luôn được tạo và do đó, SQL bạn đã tạo sẽ tạo ra bảng của bạn TRÊN nhóm tệp PRIMARY.

Xem MSDN để biết cú pháp đầy đủ.

+115

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

+0

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

+9

@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, bạn có thể bỏ qua nó và để mặc định xảy ra. Khởi tạo biến thành '0' hoặc' false' là đảm bảo rằng mã của bạn đang hoạt động trong một trạng thái đã biết, đó là một mối quan tâm hợp lý và chính xác và không phải là một mối quan tâm tối ưu. – jpmc26

11

TRÊN [PRIMARY] sẽ tạo cấu trúc trên nhóm tệp "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.

26

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

+3

được bỏ phiếu cho một ví dụ thế giới thực thay vì RTFM – JumpingJezza

+0

Nó có tác động 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 không? – RBT

+0

@RBT Có rất nhiều biến có thể ảnh hưởng đến điều này và thường rất nhiều câu trả lời sẽ bắt đầu bằng "Nó phụ thuộc nhưng ..." xem http: //dba.stackexchange.com/questions/2626/khi-nên-nonclustered-indexes-be-lưu-on-riêng-nhóm tập tin và câu hỏi liên quan – codingbadger

3

Để thêm một lưu ý 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ó thể đề 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 tại sao là do thực tế chỉ mục được tạo trong trường hợp này là chỉ mục nhóm trên cột khóa chính của bạn. Dữ liệu chỉ mục nhóm và các hàng dữ liệu trong bảng của bạn có thể KHÔNG BAO GIỜ 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à SECONDARY sau đó kịch bản được đề cập dưới đây sẽ lưu trữ dữ liệu hàng của bạn và dữ liệu chỉ mục nhóm trên cả 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. Thú vị hơn là kịch bản cũng chạy thành công (khi tôi mong đợi nó đưa ra một lỗi như tôi đã đưa ra hai nhóm tệp khác nhau: P). SQL Server thực hiện thủ thuật đằng sau khung cảnh một cách im lặng 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ỉ số của bạn có thể nằm trên một nhóm tập tin khác nhau CHỈ nếu chỉ mục được tạo ra là non-clustered trong tự nhiên.

Kịch bản dưới đây mà tạo ra một chỉ số không clustered sẽ được tạo ra trên [SECONDARY] nhóm tập tin thay vì khi dữ liệu bảng đã nằm trên nhóm [PRIMARY] 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 

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