مثالهای عملی
مثال 1: ساخت محیط آزمایش و ایجاد ایندکس
در این سناریو، ساخت محیط آزمایش و ایجاد ایندکس برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
IF OBJECT_ID(N'dbo.IndexLab_Columnstore', N'U') IS NOT NULL DROP TABLE dbo.IndexLab_Columnstore;
CREATE TABLE dbo.IndexLab_Columnstore(Id int NOT NULL, CustomerId int NULL, OrderDate date NOT NULL, TotalAmount decimal(18,2) NULL, StatusCode tinyint NULL, IsClosed bit NOT NULL DEFAULT(0));
INSERT dbo.IndexLab_Columnstore(Id,CustomerId,OrderDate,TotalAmount,StatusCode,IsClosed) VALUES (1,10,'2026-01-05',125000,1,0),(2,10,'2026-02-10',250000,2,1);
CREATE CLUSTERED COLUMNSTORE INDEX CCI_IndexLab ON dbo.IndexLab_Columnstore;
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 1 | شیء نمونه و ایندکس بدون خطا ساخته میشوند. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 1 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 2: بازرسی نوع و ویژگیهای ایندکس
در این سناریو، بازرسی نوع و ویژگیهای ایندکس برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT i.name, i.type_desc, i.is_unique, i.has_filter, i.filter_definition
FROM sys.indexes AS i
WHERE i.object_id = OBJECT_ID(N'dbo.IndexLab_Columnstore');
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 2 | نوع، یکتایی و فیلتر ایندکس در Catalog دیده میشود. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 2 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 3: تحلیل ستونهای کلیدی و Include
در این سناریو، تحلیل ستونهای کلیدی و Include برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT i.name, c.name AS column_name, ic.key_ordinal, ic.is_included_column
FROM sys.indexes AS i
JOIN sys.index_columns AS ic ON ic.object_id=i.object_id AND ic.index_id=i.index_id
JOIN sys.columns AS c ON c.object_id=ic.object_id AND c.column_id=ic.column_id
WHERE i.object_id=OBJECT_ID(N'dbo.IndexLab_Columnstore')
ORDER BY i.name, ic.key_ordinal, ic.index_column_id;
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 3 | ترتیب کلیدها و ستونهای غیرکلیدی مشخص میشود. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 3 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 4: اندازهگیری Seek، Scan و هزینه DML
در این سناریو، اندازهگیری Seek، Scan و هزینه DML برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT i.name, s.user_seeks, s.user_scans, s.user_lookups, s.user_updates
FROM sys.indexes AS i
LEFT JOIN sys.dm_db_index_usage_stats AS s ON s.database_id=DB_ID() AND s.object_id=i.object_id AND s.index_id=i.index_id
WHERE i.object_id=OBJECT_ID(N'dbo.IndexLab_Columnstore');
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 4 | تعداد Seek و Scan در کنار هزینه Update قابل مقایسه است. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 4 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 5: محاسبه فضا و تعداد ردیف
در این سناریو، محاسبه فضا و تعداد ردیف برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT i.name, SUM(ps.used_page_count)*8.0/1024 AS used_mb, SUM(ps.row_count) AS rows_count
FROM sys.indexes AS i
JOIN sys.dm_db_partition_stats AS ps ON ps.object_id=i.object_id AND ps.index_id=i.index_id
WHERE i.object_id=OBJECT_ID(N'dbo.IndexLab_Columnstore') GROUP BY i.name;
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 5 | حجم مصرفی و تعداد ردیف هر ساختار گزارش میشود. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 5 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 6: کنترل Fragmentation یا سلامت ساختار
در این سناریو، کنترل Fragmentation یا سلامت ساختار برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT i.name, ips.avg_fragmentation_in_percent, ips.page_count
FROM sys.indexes AS i
CROSS APPLY sys.dm_db_index_physical_stats(DB_ID(),i.object_id,i.index_id,NULL,'LIMITED') AS ips
WHERE i.object_id=OBJECT_ID(N'dbo.IndexLab_Columnstore');
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 6 | درصد Fragmentation یا اطلاعات سلامت قابل تصمیمگیری میشود. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 6 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 7: بررسی رفتار عملیاتی در بار واقعی
در این سناریو، بررسی رفتار عملیاتی در بار واقعی برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT i.name, ios.leaf_insert_count, ios.leaf_update_count, ios.range_scan_count
FROM sys.indexes AS i
CROSS APPLY sys.dm_db_index_operational_stats(DB_ID(),i.object_id,i.index_id,NULL) AS ios
WHERE i.object_id=OBJECT_ID(N'dbo.IndexLab_Columnstore');
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 7 | شمار درج، تغییر و Range Scan برای بار واقعی نمایش داده میشود. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 7 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 8: کنترل آمار، Disable و وضعیت نگهداری
در این سناریو، کنترل آمار، Disable و وضعیت نگهداری برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT i.name, i.is_disabled, i.is_hypothetical, STATS_DATE(i.object_id,i.index_id) AS stats_date
FROM sys.indexes AS i WHERE i.object_id=OBJECT_ID(N'dbo.IndexLab_Columnstore');
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 8 | تاریخ آمار و وضعیت فعال بودن ایندکس روشن میشود. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 8 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 9: اجرای سناریوی واقعی و مشاهده پلن
در این سناریو، اجرای سناریوی واقعی و مشاهده پلن برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SET STATISTICS IO, TIME ON;
SELECT CustomerId, COUNT_BIG(*) AS cnt, SUM(TotalAmount) AS total
FROM dbo.IndexLab_Columnstore
WHERE OrderDate >= '2026-01-01' AND OrderDate < '2027-01-01'
GROUP BY CustomerId;
SET STATISTICS IO, TIME OFF;
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 9 | خروجی کسبوکار همراه IO و زمان اجرا قابل ارزیابی است. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 9 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.
مثال 10: کنترل نسخه و چکلیست استقرار
در این سناریو، کنترل نسخه و چکلیست استقرار برای ایندکس ستونی بررسی میشود. Query را ابتدا روی پایگاه آزمایشی اجرا کنید، خروجی Catalog و Plan را ثبت کنید و سپس نتیجه را با Baseline بدون تغییر مقایسه کنید.
SELECT SERVERPROPERTY('ProductVersion') AS product_version, SERVERPROPERTY('Edition') AS edition;
SELECT i.name, i.type_desc FROM sys.indexes AS i WHERE i.object_id=OBJECT_ID(N'dbo.IndexLab_Columnstore');
| شاخص | خروجی مورد انتظار |
|---|
| نتیجه مثال 10 | نسخه موتور و پشتیبانی قابلیت پیش از استقرار تأیید میشود. |
| کاربرد واقعی | تصمیم درباره انبار داده، تجمیع حجیم و گزارشگیری تحلیلی بر پایه اندازهگیری و نه حدس |
نکته فنی: مثال 10 یک بُعد متفاوت از چرخه عمر ایندکس را میسنجد. اعداد مطلق میان سرورها قابل مقایسه نیستند؛ تغییر IO، CPU، Duration، Memory Grant و تعداد ردیف تخمینی در همان محیط معیار معتبرتری است.