تفاوت Clustered Index و NONCLUSTERED INDEX در دو جدول با داده های یکسان و ساختار یکسان

تفاوت Clustered Index و NONCLUSTERED INDEX در SQL

توسط admin | گروه SQL Server | 1404/01/24

نظرات 0

📌 تفاوت Clustered Index و Nonclustered Index

(در دو جدول با داده‌ها و ساختار یکسان)

در این سناریو، دو جدول با ساختار دقیقاً یکسان و داده‌های مشابه داریم. تنها تفاوت آن‌ها در نوع ایندکس اعمال‌شده روی ستون کلیدی OrderId است:

  • جدول Orders1 دارای Nonclustered Index روی ستون OrderId است (به‌همراه INCLUDE برای ستون‌های دیگر).

  • جدول Orders2 دارای Clustered Index روی ستون OrderId است (که به‌صورت پیش‌فرض، Primary Key نیز هست).


تفاوت Clustered Index و NONCLUSTERED INDEX در دو جدول با داده های یکسان و ساختار یکسان

🧠 تفاوت‌های کلیدی:

مورد Clustered Index (Orders2) Nonclustered Index (Orders1)
ساختار ذخیره‌سازی داده‌ها بر اساس ایندکس مرتب شده‌اند و ایندکس خودش جدول اصلی است. ایندکس جداگانه از داده‌های جدول است. داده‌ها جای دیگری قرار دارند.
نوع دسترسی مستقیماً داده واقعی از B-Tree خوانده می‌شود. ابتدا ردیف در ایندکس پیدا می‌شود، سپس داده از جدول اصلی یا از INCLUDE خوانده می‌شود.
Lookup نیاز دارد؟ خیر، چون داده اصلی در خود ایندکس است. اگر ایندکس Covering نباشد → بله (Lookup لازم است).
سرعت در دسترسی به کل رکوردها سریع‌تر است، چون مرتب است و در ساختار اصلی داده‌هاست. بستگی به Covering بودن ایندکس دارد. در صورت عدم Cover، کندتر خواهد بود.
اندازه ایندکس بزرگ‌تر است (کل داده‌ها در آنند). سبک‌تر است (فقط ستون‌های ایندکس + INCLUDE).
تعداد ایندکس‌های مجاز فقط یکی می‌تواند Clustered باشد. چندین Nonclustered Index قابل تعریف است.

✅ عملکرد در این مثال خاص:

  • هر دو جدول در تست اجرا شده عملکرد مشابهی داشتند از نظر تعداد ردیف‌ها، هزینه تخمینی اجرا، و نوع عملیات (Index Seek).

  • اما در حالت بهینه (بدون خطای نوع داده یا CONVERT_IMPLICIT)، ایندکس Nonclustered وقتی Covering باشد، می‌تواند سریع‌تر عمل کند چون سبک‌تر است و نیازی به مراجعه به جدول اصلی ندارد.

  • با این حال، در سناریوهایی که داده زیاد است یا نیاز به مرتب‌سازی، فیلترگیری‌های پشت‌سرهم یا دسترسی به تمام ستون‌ها باشد، Clustered Index عملکرد بهتری ارائه می‌دهد.


🔚 نتیجه‌گیری:

در دو جدول با داده یکسان:

  • اگر فقط تعداد کمی ستون برای خواندن لازم باشد و ایندکس Nonclustered به صورت Covering طراحی شده باشد، Nonclustered Index سریع‌تر و سبک‌تر عمل می‌کند.

  • اما اگر دسترسی به تمام ستون‌ها یا مرتب‌سازی موردنیاز باشد، Clustered Index به دلیل ساختار ذخیره‌سازی خود، پرفورمنس بهتری دارد.

مثال

use tempdb

go

create database [TestTuningDB]

go

use [TestTuningDB]

go

CREATE TABLE Orders1 (

    OrderId INT PRIMARY KEY,

    Amount DECIMAL(10,2),

      GoodsStatus nvarchar(10));

GO

CREATE TABLE Orders2 (

    OrderId INT PRIMARY KEY,

    Amount DECIMAL(10,2),

      GoodsStatus nvarchar(10));

GO

CREATE NONCLUSTERED INDEX IX_Orders1_OrderId

ON Orders1 (OrderId)

INCLUDE (Amount, GoodsStatus);

GO

INSERT INTO Orders1 (OrderId, Amount, GoodsStatus) VALUES

(1, 1200.50, N'OK'),

(2, 500.00, N'WAIT'),

(3, 1200.50, N'OK'),

(4, 200.00, N'CANCEL'),

(5, 850.75, N'WAIT'),

(6, 1500.00, N'OK'),

(7, 750.00, N'CANCEL'),

(8, 400.00, N'WAIT'),

(9, 1200.50, N'OK'),

(10, 950.00, N'SENT');

GO

INSERT INTO Orders2 (OrderId, Amount, GoodsStatus) VALUES

(1, 1200.50, N'OK'),

(2, 500.00, N'WAIT'),

(3, 1200.50, N'OK'),

(4, 200.00, N'CANCEL'),

(5, 850.75, N'WAIT'),

(6, 1500.00, N'OK'),

(7, 750.00, N'CANCEL'),

(8, 400.00, N'WAIT'),

(9, 1200.50, N'OK'),

(10, 950.00, N'SENT');

 

GO

 

خلاصه‌ی اطلاعات تصویر:

ویژگی / مقایسه

NonClustered Seek (چپ)

Clustered Seek (راست)

Actual Rows Read

10

10

Actual Rows Returned

3

3

Estimated Operator Cost

0.0032853 (100%)

0.0032853 (100%)

Estimated I/O Cost

0.003125

0.003125

Estimated CPU Cost

0.0001603

0.0001603

Seek Predicate

= @orderId (درست و مستقیم)

= @orderId

Row Size

34 B

34 B

Execution Count

1

1


نتیجه: تقریباً عملکردشون یکسانه، ولی...

برتری کوچک NonClustered در این سناریو چون:

  • ایندکس NonClustered در اینجا Covering Index هست (یعنی تمام فیلدهای موردنیاز توی INCLUDE هستند) بنابراین نیازی به رفتن سراغ Heap یا Clustered Data Row نیست.
  • این یعنی: I/O واقعی‌اش در اکثر سیستم‌ها ممکنه کمی کمتر باشه، مخصوصاً وقتی حجم دیتا زیاد باشه یا ایندکس کلاستر سنگین باشه.

تفاوت Clustered Index و NONCLUSTERED INDEX در دو جدول با داده های یکسان و ساختار یکسان

پس کدوم بهتره؟

در این وضعیت خاص:

 از نظر تئوری و پرفورمنس ریز NonClustered Index Seek  بهتر عمل کرده.   چرا؟

  • چون فقط از یه ساختار سبک‌تر (ایندکس جداگانه) خونده.
  • از جدول اصلی دیتایی نکشیده.
  • دقیقاً همون 3 ردیف رو سریع پیدا کرده.

اگه ایندکس NonClustered نبود  Covering، مجبور می‌شد بره Lookup بزنه، که اون موقع Clustered  برتری داشت.


 جمع‌بندی نهایی:

مورد

NonClustered Index Seek

Clustered Index Seek

استفاده از ایندکس سبک

نیاز به Lookup

Rows Returned

3

3

هزینه‌ها (همه برابر بودن)

=

=

برتری پرفورمنسی واقعی؟

(لبه‌ی خیلی کوچیک)

تقریباً برابر


 

اگر حجم دیتا زیادتر بود یا تعداد ستون‌های جدول زیاد، تفاوت به نفع NonClustered با ایندکس Covering بیشتر مشخص می‌شد.

 

برچسبها : Clustered Index Composite Index Covering Index Data Filtering Data Pages Data Reading Data Writing Database Database Stress Denormalization Execution Plan Index Data Index Scan Index Seek Index Usage Statistics Indexing IO Statistics Nonclustered Index Optimize Reads Optimize Writes Performance Test Performance Tuning Plan Analysis Query Optimization Query Profiling Query Speed Query Tuning Examples Query Writing Reduce Execution Time Resource Management SQL Analyzer SQL Best Practices SQL Cache SQL Code SQL Cost-Based Optimization SQL Debugging SQL Design Patterns SQL Efficiency SQL Engine Behavior SQL Execution SQL Index SQL Index Design SQL Index INCLUDE SQL Index Tuning SQL IO Statistics SQL Join Performance SQL Monitoring SQL Optimization SQL Optimization Steps SQL Performance SQL Performance Comparis SQL Plan Analyzer SQL Plan Cache SQL Profiler SQL Query Cost SQL Query Plan SQL Query Troubleshooting SQL Read Performance SQL Script Tuning SQL Scripts SQL Server SQL Server Index Strategy SQL Server Indexing SQL Server Internals SQL Server IO SQL Server Monitoring Tools SQL Server Performance Tips SQL Server Query Cost SQL Storage SQL Table Design SQL Test Cases SQL Trace SQL Tuning SQL Tuning Techniques SQL Tuning Tools Test Database Test Tables آنالیز SQL Server ابزارهای تیونینگ استراتژی ایندکس افزایش سرعت کوئری ایندکس‌گذاری ایندکس‌های ترکیبی ایندکس پوششی ایندکس خوشه‌ای ایندکس غیرخوشه‌ای بررسی Index Seek بهترین روش‌ها در SQL بهینه‌سازی خواندن داده بهینه‌سازی نوشتن بهینه‌سازی کوئری پایش SQL Server پایگاه داده پایگاه داده تستی پرفورمنس پروفایلینگ کوئری تجزیه و تحلیل اجرا تحلیل Execution Plan تحلیل عملکرد تست عملکرد تکنیک‌های تیونینگ جداول آزمایشی خواندن داده دستور SELECT دستور WHERE رفع مشکل کوئری ساختار داخلی SQL طراحی ایندکس طراحی جدول عملکرد جوین‌ها عملکرد خواندن در SQL فشار بر پایگاه داده فیلترینگ داده مثال‌های تیونینگ مدیریت منابع مراحل بهینه‌سازی مقایسه ایندکس‌ها نرمال‌سازی نمایه‌سازی داده‌ها نوشتن داده نکات پرفورمنسی هزینه کوئری کاهش زمان اجرا کوئری‌نویسی

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر