خانه SQL Server تفاوت Primary Key و Clustered Index SQL Server دستورات SQL نوشته شده توسط: تورج عزیزی تاریخ انتشار: ۳۰ آبان ۱۳۹۴ آخرین بروزرسانی: 26 اردیبهشت 1402 زمان مطالعه: 10 دقیقه ۲ (۱۱) مقدمه در این مقاله قصد دارم شما رو با یک موضوع مهم در SQL Server که بیشتر مواقع برنامه نویس ها و DBA ها در درک اون مشکل دارند آشنا کنم. این موضوع تفاوت بین Primary Key و Clustered Index است. Primary Key چیست؟ اجازه دهید ابتدا در مورد خود قید Primary Key صحبت کنیم. همانطور که می توان از نام این قید فهمید، شما با این قید از SQL Server می خواهید که در یک ستون یا گروهی از ستون ها فقط مقدار یونیک وارد شود. اسکریپت زیر تعریفی ساده از یک جدول نشان می دهد که در آن قید Primary Key روی ستون Col1 جدول تعریف شده است. CREATE TABLE Foo ( Col1 INT NOT NULL PRIMARY KEY, Col2 INT NOT NULL, Col3 INT NOT NULL ) GO حالا وقتی در این جدول رکورد درج می کنید، SQL Server از یونیک بودن مقادیر وارده شده در ستون Col1 اطمینان حاصل می کند. حالا اگر سعی کنید مقادیر تکراری وارد کنید، SQL Server پیام خطا صادر می کند: -- Try to insert a duplicate value INSERT INTO Foo Values (1, 1, 1), (1, 2, 2) GO Msg 2627, Level 14, State 1, Line 9 Violation of PRIMARY KEY constraint ‘PK__Foo__A259EE544224D12A’. Cannot insert duplicate key in object ‘dbo.Foo’. The duplicate key value is (1). The statement has been terminated. قید Primary Key خودش در سطح منطقی تعریف می شود- شما فقط به SQL Server می گوئید در این ستون مقادیر یونیک می خواهید. اما SQL Server این قید را در سطح فیزیکی هم باید تامین کند – در ساختمان داده هایی که شما در آنها داده هایتان را ذخیره می کنید. در مورد SQL Server در سطح فیزیکی این کار توسط ایندکس ها انجام می شود : توسط یک Clustered Index یا NonClustered Index. تحمیل قید Primary Key و قتی شما قید Primary Key را مشخص می کنید، SQL Server به طور پیش فرض این قید را با استفاده از یک Unique Clustered Index در سطح فیزیکی تحمیل می کند. اگر به sys.indexes نگاهی بیندازید می بینید که SQL Server یک Unique Clustered Index ایجاد کرده است که برای تحمیل قید Primary Key استفاده شده است. -- SQL Server generates by default a Unique Clustered Index SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('Foo') GO همانطوری که گفتم به طور پیش فرض Unique Clustered Index ایجاد شده است. شما می توانید تحمیل قید Primary Key را با استفاده از NonClustered Index انجام دهید: -- Enforces the Primary Key constraint with a Unique Non-Clustered Index CREATE TABLE Foo1 ( Col1 INT NOT NULL PRIMARY KEY NONCLUSTERED, Col2 INT NOT NULL, Col3 INT NOT NULL ) GO وقتی قید Primary Key را مشخص می کنید می توانید دو گزینه را مشخص کنید: Clustered Nonclustered گزینه Clustered پیش فرض است، بنابراین لزومی بر تعیین آن نیست. حالا اگر دوباره به sys.indexes نگاه کنید، متوجه می شوید که یک HEAP در مقابل دارید (جدولی بدون Clustered Index) و اینکه SQL Server یک ایندکس Nonclustered اضافی برای تحمیل قید Primary Key ایجاد کرده است. -- SQL Server has generated now a Unique Non-Clustered Index to -- enforce the Primary Key constraint SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('Foo1') GO Primary Key <> Clustered Index نتیجه اینکه همیشه Primary Key و Clustered Index در SQL Server با هم برابر نیستند. این یک پیش فرض است و شما می توانید آن را تغییر دهید. قید Primary Key در سطح منطقی است و ساختار ایندکس در سطح فیزیکی برای تحمیل خود قید استفاده می شود. چه رتبه ای میدهید؟ میانگین ۲ / ۵. از مجموع ۱۱ اولین نفر باش دانلود مقاله تفاوت Primary Key و Clustered Index فرمت PDF 2 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 18 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تورج عزیزی معرفی محصول ایمان باقری آموزش کوئری نویسی در sql server 2.190.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ تورج عزیزی ۳۰ / ۰۸ / ۹۴ - ۰۲:۴۸ سلام منظور از سطح منطقی آن چیزی است که شما در ذهنتان انتظار دارید اتفاق بیفتد اما سطح فیزیکی آن چیزی است که برای رسیدن به خواسته ذهنی شما در واقعیت پیاده سازی می شود. یکتا بودن یک مفهوم منطقی است و در واقعیت باید با یک مکانیزم پیاده سازی شود. پاسخ به دیدگاه فرشید علی اکبری ۳۰ / ۰۸ / ۹۴ - ۱۲:۳۲ سلام تشکر از بابت مطلب خوبی که ارسال کردید ولی با توجه به یکی دوتا از مقاله های قبلی شما من مطمئنم درآینده نزدیک شاهد مقالات تخصصی تری نیز در این زمینه از شما خواهیم بود. موفق باشید. پاسخ به دیدگاه عبادی ۳۰ / ۰۸ / ۹۴ - ۱۱:۴۹ با سلام و عرض ادب ممنون از زحمات شما دوست عزیز ، لطفا بفرمایید منظورتان از سطح منطقی و سطح فیزیکی جدول چیست ؟ توضیح بفرمایید . با تشکر پاسخ به دیدگاه 1 2