ON [หลัก] หมายความว่าอย่างไร


237

ฉันกำลังสร้างสคริปต์การตั้งค่า SQL และฉันใช้สคริปต์ของคนอื่นเป็นตัวอย่าง นี่คือตัวอย่างของสคริปต์:

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

ไม่มีใครรู้ว่าสิ่งที่คำสั่ง ON [หลัก] ทำอะไร?

คำตอบ:


248

เมื่อคุณสร้างฐานข้อมูลใน Microsoft SQL Server คุณสามารถมีกลุ่มไฟล์ได้หลายกลุ่มโดยที่ที่เก็บข้อมูลถูกสร้างขึ้นในหลาย ๆ ตำแหน่งไดเรกทอรีหรือดิสก์ แต่ละกลุ่มไฟล์สามารถตั้งชื่อได้ กลุ่มไฟล์หลักเป็นค่าเริ่มต้นซึ่งจะถูกสร้างขึ้นเสมอและ SQL ที่คุณให้ไว้จะสร้างตารางของคุณบนกลุ่มไฟล์หลัก

ดูMSDNสำหรับไวยากรณ์ทั้งหมด


153
นี่ก็หมายความว่าปกติแล้วมันไร้ประโยชน์และสามารถลบออกได้อย่างปลอดภัยจากสคริปต์
MGOwen

ใช่ด้วยวิธีเดียวกับที่คุณสามารถละเว้นการเริ่มต้นตัวแปรเป็น 0 และเท็จเพราะมันเป็นเพียงค่าเริ่มต้นใช่ไหม
Mark Sowul

12
@MarkSowul ยกเว้นว่าคุณมีเหตุผลที่ดีที่จะใช้สิ่งนี้เพื่อเพิ่มประสิทธิภาพการทำงานใช่มันก็ดีที่จะละเว้นมันและปล่อยให้ค่าเริ่มต้นเกิดขึ้น (ดังนั้น MGOwen ที่ "ปกติ" จะรวมอยู่ด้วย) การเตรียมใช้งานตัวแปรให้0หรือfalseเกี่ยวข้องกับการทำให้แน่ใจว่าโค้ดของคุณทำงานในสถานะที่รู้จักซึ่งเป็นข้อกังวลเชิงตรรกะและความถูกต้องและไม่เกี่ยวข้องกับการปรับให้เหมาะสม
jpmc26

3
ฉันเห็นON PRIMARYไวยากรณ์สองครั้งในสคริปต์ - หนึ่งสำหรับตารางและอื่น ๆ สำหรับข้อ จำกัด ของตาราง มันหมายถึงอะไรในกรณีที่มีข้อ จำกัด ของตารางในแง่ของการจัดเก็บ? มันฟังดูไม่เกี่ยวข้องหรือซ้ำซ้อนกับฉัน วากยสัมพันธ์มันควรจะเพียงพอที่จะพูดถึงมันเพียงครั้งเดียวที่ระดับตารางหรือเป็นไปได้หรือไม่ที่จะจัดเก็บตารางในกลุ่มไฟล์หลักและข้อมูลข้อ จำกัด ของตารางในกลุ่มไฟล์ที่ไม่ใช่ข้อมูลหลัก?
RBT

1
นี่คือลิงค์MSDNจริง หนึ่งในคำตอบใช้งานไม่ได้และฉันไม่สามารถแก้ไขโพสต์ได้!
Shekhar

38

มันหมายถึงไฟล์กลุ่มวัตถุที่คุณกำลังสร้างอยู่ ดังนั้นกลุ่มไฟล์หลักของคุณสามารถอยู่ในไดรฟ์ D: \ ของเซิร์ฟเวอร์ของคุณ จากนั้นคุณสามารถสร้างกลุ่มไฟล์อื่นที่เรียกว่าดัชนี กลุ่มไฟล์นี้อาจอยู่ในไดรฟ์ E: \ ของเซิร์ฟเวอร์ของคุณ


จะมีผลกระทบด้านลบหรือไม่หากฉันจัดเก็บตารางไว้ในกลุ่มไฟล์หลักและข้อ จำกัด ของตารางหรือโครงสร้างข้อมูลดัชนีในกลุ่มไฟล์อื่น
RBT

@RBT มีตัวแปรมากมายที่สามารถส่งผลกระทบต่อสิ่งนี้และโดยปกติคำตอบมากมายจะเริ่มต้นด้วย "ขึ้นอยู่กับ ... " ดูdba.stackexchange.com/questions/2626/และคำถามที่เกี่ยวข้อง
codingbadger

16

เปิด [หลัก] จะสร้างโครงสร้างในกลุ่มไฟล์ "หลัก" ในกรณีนี้ดัชนีคีย์หลักและตารางจะถูกวางในกลุ่มไฟล์ "หลัก" ภายในฐานข้อมูล


7

ในการเพิ่มบันทึกย่อที่สำคัญมากเกี่ยวกับสิ่งที่ Mark S. ได้กล่าวไว้ในโพสต์ของเขา ในสคริปต์ SQL เฉพาะที่ถูกกล่าวถึงในคำถามคุณไม่สามารถพูดถึงกลุ่มไฟล์ที่แตกต่างกันสองกลุ่มสำหรับการจัดเก็บแถวข้อมูลของคุณและโครงสร้างข้อมูลดัชนี

สาเหตุที่เกิดจากข้อเท็จจริงที่ว่าดัชนีที่ถูกสร้างขึ้นในกรณีนี้เป็นดัชนีคลัสเตอร์ในคอลัมน์คีย์หลักของคุณ ข้อมูลดัชนีคลัสเตอร์และแถวข้อมูลในตารางของคุณไม่สามารถอยู่ในกลุ่มไฟล์อื่นได้

ดังนั้นในกรณีที่คุณมีสองกลุ่มไฟล์บนฐานข้อมูลของคุณเช่นประถมศึกษาและมัธยมศึกษาสคริปต์แล้วกล่าวถึงข้างล่างจะเก็บข้อมูลแถวของคุณและข้อมูลดัชนีคลัสเตอร์ทั้งในกลุ่มของแฟ้ม PRIMARY ตัวเองแม้ว่าฉันได้กล่าวกลุ่มไฟล์ที่แตกต่าง ( [SECONDARY]) สำหรับข้อมูลตาราง . น่าสนใจยิ่งกว่าสคริปต์ทำงานได้สำเร็จเช่นกัน (เมื่อฉันคาดว่าจะให้ข้อผิดพลาดเนื่องจากฉันได้รับกลุ่มไฟล์ที่แตกต่างกันสองกลุ่ม: P) SQL Server ใช้เคล็ดลับเบื้องหลังอย่างเงียบ ๆ และชาญฉลาด

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

หมายเหตุ: ดัชนีของคุณสามารถอยู่ในกลุ่มไฟล์ที่แตกต่างเท่านั้นถ้าดัชนีที่ถูกสร้างขึ้นไม่เป็นคลัสเตอร์ในธรรมชาติ

สคริปต์ด้านล่างซึ่งสร้างดัชนีที่ไม่ทำคลัสเตอร์จะถูกสร้างใน[SECONDARY]กลุ่มไฟล์แทนเมื่อข้อมูลตารางอยู่ใน[PRIMARY]กลุ่มไฟล์แล้ว:

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

คุณสามารถรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจัดเก็บดัชนีที่ไม่ได้ทำคลัสเตอร์ในกลุ่มไฟล์ที่แตกต่างกันเพื่อช่วยให้แบบสอบถามของคุณทำงานได้ดีขึ้น นี่คือลิงค์เดียว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.