آموزش DMV فیزیکی Rowgroupهای Columnstore
آموزش DMV فیزیکی Rowgroupهای Columnstore
تابع مدیریتی sys.dm_db_column_store_row_group_physical_stats وضعیت جاری Rowgroupها، تعداد کل و حذفشده، اندازه، دلیل Trim و مسیر انتقال به حالت فشرده را در پایگاه داده جاری گزارش میکند. در این راهنما موضوع از سطح مقدماتی تا طراحی عملی، خطاهای رایج، ملاحظات کارایی و سناریوهای نگهداری بررسی میشود.
مخاطب مقاله برنامهنویسان، مدیران پایگاه داده و تحلیلگرانی هستند که میخواهند Related DMVs: sys.dm_db_column_store_row_group_physical_stats را بدون تصمیمهای حدسی در Microsoft SQL Server بهکار بگیرند. بازگشت به راهنمای جامع کارایی Columnstore در SQL Server
تعریف و جایگاه موضوع
تابع مدیریتی sys.dm_db_column_store_row_group_physical_stats وضعیت جاری Rowgroupها، تعداد کل و حذفشده، اندازه، دلیل Trim و مسیر انتقال به حالت فشرده را در پایگاه داده جاری گزارش میکند.
این قابلیت را باید در کنار مفاهیم sys.dm_db_column_store_row_group_physical_stats، state_desc، total_rows و deleted_rows تحلیل کرد. تصمیم درست تنها با مشاهده یک Query سریع حاصل نمیشود؛ بلکه نرخ رشد داده، الگوی DML، نحوه بارگذاری، محدودیت منابع و زمان نگهداری نیز باید وارد مدل تصمیم شوند.
نکته نسخه: این DMV در SQL Server 2016 و نسخههای بعدی در دسترس است و برای مشاهده کامل ممکن است مجوزهای مشاهده وضعیت پایگاه داده لازم باشد.
چرا این موضوع مهم است؟
در جداول تحلیلی بزرگ، تفاوت میان طراحی درست و اجرای صرف یک دستور میتواند به اختلاف قابلتوجه در IO، CPU و زمان پاسخ منجر شود. DMV فیزیکی Rowgroup وقتی ارزش واقعی ایجاد میکند که با هدف کسبوکار، الگوی Query و ظرفیت زیرساخت هماهنگ باشد.
- گزارش سلامت CCI
- تشخیص Rowgroup کوچک
- پایش حذف
- تحلیل Trim Reason
- تصمیم نگهداری
به همین دلیل لازم است معیار موفقیت پیش از پیادهسازی تعریف شود. برای نمونه میتوان زمان گزارش ماهانه، تعداد Rowgroupهای کمحجم، درصد ردیفهای حذفشده، حجم Log یا تعداد Segmentهای خواندهشده را بهعنوان شاخص پایه ثبت کرد.
این نمودار اجزای کلیدی «DMV فیزیکی Rowgroup» و ارتباط میان sys.dm_db_column_store_row_group_physical_stats، state_desc و total_rows را نشان میدهد.
نحو، اجزا و پارامترهای اصلی
نحو پایه زیر نقطه شروع است. نام شیء، Schema، پارتیشن و گزینهها باید با محیط واقعی جایگزین شوند. در رشتههای فارسی SQL از پیشوند N استفاده شده تا داده یونیکد درست ذخیره شود.
SELECT * FROM sys.dm_db_column_store_row_group_physical_stats;
اجزای کلیدی
| مفهوم | نقش در موضوع | نکته عملی |
|---|
| sys.dm_db_column_store_row_group_physical_stats | بخشی از معماری یا رفتار DMV فیزیکی Rowgroup | نام جدول و ایندکس را Join کنید |
| state_desc | بخشی از معماری یا رفتار DMV فیزیکی Rowgroup | درصدها را با NULLIF بسازید |
| total_rows | بخشی از معماری یا رفتار DMV فیزیکی Rowgroup | تاریخ Snapshot ذخیره کنید |
| deleted_rows | بخشی از معماری یا رفتار DMV فیزیکی Rowgroup | پارتیشن را لحاظ کنید |
| trim_reason_desc | بخشی از معماری یا رفتار DMV فیزیکی Rowgroup | پس از عملیات دوباره اندازهگیری کنید |
| size_in_bytes | بخشی از معماری یا رفتار DMV فیزیکی Rowgroup | نام جدول و ایندکس را Join کنید |
نوع خروجی بسته به موضوع ممکن است یک ساختار ایندکس، Plan اجرایی، مجموعه Rowgroup، شمارنده DMV یا مقدار عددی باشد. همیشه خروجی را با Metadata و Plan واقعی تأیید کنید؛ پیام موفقیت دستور بهتنهایی نشاندهنده بهبود نیست.
فرایند تصمیمگیری و پیادهسازی
- Workload اصلی را مشخص کنید و Queryهای پرتکرار مرتبط با DMV فیزیکی Rowgroup را از Query Store یا مانیتورینگ استخراج کنید.
- وضعیت فعلی state_desc و total_rows را ثبت کنید تا خط پایه قابل مقایسه باشد.
- Syntax را در محیط آزمایشی اجرا کنید و اثر آن را روی فیلتر Object/Index و نمونهبرداری دورهای بسنجید.
- سناریوهای بارگذاری، حذف، بهروزرسانی، گزارشگیری و بازیابی خطا را جداگانه آزمایش کنید.
- پس از تأیید، اجرای Production را با پنجره تغییر، Rollback Plan و گزارش کنترلی انجام دهید.
این روش مرحلهای مانع آن میشود که یک بهبود محلی، هزینه پنهان در ETL یا عملیات تراکنشی ایجاد کند. همچنین مستندسازی خروجیهای قبل و بعد، تصمیمهای نگهداری آینده را قابل دفاع میسازد.
در این جریان، داده از مرحله ورودی عبور میکند، در نقطههای کنترلی مرتبط با state_desc و deleted_rows ارزیابی میشود و سپس نتیجه قابل پایش تولید میگردد.
۱۰ مثال عملی از ساده تا حرفهای
مثال 1: نمای کلی DMV
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی نمای کلی DMV بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT state_desc, COUNT(*) AS rowgroup_count, SUM(total_rows) AS total_rows FROM sys.dm_db_column_store_row_group_physical_stats GROUP BY state_desc;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 101 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ فیلتر Object/Index را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 2: فیلتر روی شیء هدف
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی فیلتر روی شیء هدف بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT object_id,index_id,partition_number,row_group_id,state_desc,total_rows,deleted_rows,size_in_bytes FROM sys.dm_db_column_store_row_group_physical_stats ORDER BY object_id,index_id,row_group_id;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 102 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ نمونهبرداری دورهای را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 3: اتصال به Metadata
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی اتصال به Metadata بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT OBJECT_SCHEMA_NAME(object_id) AS schema_name,OBJECT_NAME(object_id) AS table_name,state_desc,total_rows,deleted_rows FROM sys.dm_db_column_store_row_group_physical_stats;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 103 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ Aggregation را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 4: محاسبه شاخص سلامت
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی محاسبه شاخص سلامت بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT *,CAST(100.0*deleted_rows/NULLIF(total_rows,0) AS decimal(6,2)) AS deleted_pct FROM sys.dm_db_column_store_row_group_physical_stats;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 104 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ نسبت حذف را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 5: گروهبندی تحلیلی
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی گروهبندی تحلیلی بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT trim_reason_desc,COUNT(*) AS cnt,AVG(total_rows*1.0) AS avg_rows FROM sys.dm_db_column_store_row_group_physical_stats GROUP BY trim_reason_desc;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 105 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ اندازه Rowgroup را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 6: بررسی علت یا نوع انتقال
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی بررسی علت یا نوع انتقال بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT transition_to_compressed_state_desc,COUNT(*) AS cnt FROM sys.dm_db_column_store_row_group_physical_stats GROUP BY transition_to_compressed_state_desc;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 106 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ فیلتر Object/Index را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 7: شناسایی موارد نیازمند توجه
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی شناسایی موارد نیازمند توجه بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT TOP (20) * FROM sys.dm_db_column_store_row_group_physical_stats WHERE state_desc IN (N'OPEN',N'CLOSED') ORDER BY total_rows DESC;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 107 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ نمونهبرداری دورهای را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 8: گزارش سطح پارتیشن
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی گزارش سطح پارتیشن بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT partition_number,SUM(total_rows-deleted_rows) AS active_rows,SUM(size_in_bytes) AS bytes_used FROM sys.dm_db_column_store_row_group_physical_stats GROUP BY partition_number;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 108 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ Aggregation را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 9: یافتن الگوی کمبازده
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی یافتن الگوی کمبازده بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT object_id,index_id,COUNT(*) AS small_rowgroups FROM sys.dm_db_column_store_row_group_physical_stats WHERE state_desc=N'COMPRESSED' AND total_rows<100000 GROUP BY object_id,index_id;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 109 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ نسبت حذف را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 10: ساخت Snapshot پایش
در این مثال، «DMV فیزیکی Rowgroup» در سناریوی ساخت Snapshot پایش بررسی میشود. Query بهگونهای نوشته شده که در یک محیط آزمایشی SQL Server قابل اجرا باشد و نتیجه آن با DMV، خروجی تجمیعی یا Metadata کنترل شود.
USE tempdb;
DROP TABLE IF EXISTS dbo.FactSalesDemo;
CREATE TABLE dbo.FactSalesDemo
(
SaleID bigint NOT NULL,
OrderDate date NOT NULL,
CustomerID int NOT NULL,
ProductID int NOT NULL,
Quantity smallint NULL,
Amount decimal(18,2) NULL
);
INSERT INTO dbo.FactSalesDemo
(
SaleID, OrderDate, CustomerID, ProductID, Quantity, Amount
)
SELECT TOP (25000)
ROW_NUMBER() OVER (ORDER BY (SELECT NULL)),
DATEADD(day, -ABS(CHECKSUM(NEWID())) % 730, CONVERT(date, '20260727')),
1 + ABS(CHECKSUM(NEWID())) % 5000,
1 + ABS(CHECKSUM(NEWID())) % 800,
1 + ABS(CHECKSUM(NEWID())) % 12,
CONVERT(decimal(18,2), 10 + ABS(CHECKSUM(NEWID())) % 50000 / 10.0)
FROM sys.all_objects AS a
CROSS JOIN sys.all_objects AS b;
CREATE CLUSTERED COLUMNSTORE INDEX CCI_FactSalesDemo
ON dbo.FactSalesDemo;
SELECT GETDATE() AS sample_time,object_id,index_id,row_group_id,state_desc,total_rows,deleted_rows,size_in_bytes FROM sys.dm_db_column_store_row_group_physical_stats;
| شاخص | خروجی نمونه | تفسیر |
|---|
| object_id | 245575913 | شناسه نمونه شیء |
| state_desc | COMPRESSED | وضعیت نمونه Rowgroup |
| sample_value | 110 | عدد نمایشی برای توضیح ستون |
نکته فنی: هنگام استفاده از Related DMVs: sys.dm_db_column_store_row_group_physical_stats فقط به موفقبودن دستور اکتفا نکنید؛ اندازه Rowgroup را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
خطاهای رایج
خطاهای زیر در پروژههای واقعی مرتبط با Related DMVs: sys.dm_db_column_store_row_group_physical_stats دیده میشوند. شدت هر خطا به حجم داده و نسخه SQL Server وابسته است، اما اصل کنترل برای همه محیطها یکسان است.
- SELECT * بدون فیلتر در سرور شلوغ
- نادیده گرفتن partition_number
- تقسیم بر صفر
- تفسیر snapshot بهعنوان روند
- عدم اتصال به sys.indexes
مهمترین هشدار: SELECT * بدون فیلتر در سرور شلوغ. پیش از هر تغییر گسترده، Backup/Restore آزمایشی، ظرفیت Log و امکان بازگشت را بررسی کنید.
ملاحظات کارایی و پایش
برای ارزیابی DMV فیزیکی Rowgroup حداقل پنج محور باید همزمان دیده شود: فیلتر Object/Index, نمونهبرداری دورهای, Aggregation, نسبت حذف, اندازه Rowgroup. اندازهگیری تنها زمان اجرا ممکن است نتیجه گمراهکننده بدهد، زیرا Cache گرم، Parallelism، Memory Grant و بار همزمان روی نتیجه اثر دارند.
| معیار | چرا مهم است؟ | روش پیشنهادی |
|---|
| فیلتر Object/Index | اثر مستقیم بر کیفیت یا هزینه DMV فیزیکی Rowgroup دارد | نام جدول و ایندکس را Join کنید |
| نمونهبرداری دورهای | اثر مستقیم بر کیفیت یا هزینه DMV فیزیکی Rowgroup دارد | درصدها را با NULLIF بسازید |
| Aggregation | اثر مستقیم بر کیفیت یا هزینه DMV فیزیکی Rowgroup دارد | تاریخ Snapshot ذخیره کنید |
| نسبت حذف | اثر مستقیم بر کیفیت یا هزینه DMV فیزیکی Rowgroup دارد | پارتیشن را لحاظ کنید |
| اندازه Rowgroup | اثر مستقیم بر کیفیت یا هزینه DMV فیزیکی Rowgroup دارد | پس از عملیات دوباره اندازهگیری کنید |
یک Snapshot منفرد برای تصمیم بلندمدت کافی نیست. داده پایش را در چند بازه کاری، پس از ETL و در ساعات اوج جمعآوری کنید تا روند واقعی مشخص شود.
این سناریو تفاوت میان اجرای بدون پایش و اجرای مبتنی بر Best Practice را برای DMV فیزیکی Rowgroup مقایسه میکند؛ معیارهای اصلی شامل فیلتر Object/Index و نمونهبرداری دورهای هستند.
بهترین روشها
- نام جدول و ایندکس را Join کنید
- درصدها را با NULLIF بسازید
- تاریخ Snapshot ذخیره کنید
- پارتیشن را لحاظ کنید
- پس از عملیات دوباره اندازهگیری کنید
Best Practice بهمعنای اجرای یک نسخه ثابت برای همه سرورها نیست. باید توصیهها را با اندازه داده، Edition، Compatibility Level، معماری HA/DR و محدودیت پنجره نگهداری تطبیق داد.
پرسشهای متداول
DMV فیزیکی Rowgroup دقیقاً چه مشکلی را حل میکند؟
تابع مدیریتی sys.dm_db_column_store_row_group_physical_stats وضعیت جاری Rowgroupها، تعداد کل و حذفشده، اندازه، دلیل Trim و مسیر انتقال به حالت فشرده را در پایگاه داده جاری گزارش میکند. انتخاب آن باید براساس نوع بارکاری و معیارهای قابل اندازهگیری انجام شود.
برای شروع یادگیری Related DMVs: sys.dm_db_column_store_row_group_physical_stats چه پیشنیازی لازم است؟
آشنایی با Execution Plan، ایندکسها و دستورات پایه T-SQL کافی است. سپس باید مفاهیم state_desc و total_rows را روی یک پایگاه داده آزمایشی مشاهده کنید.
آیا DMV فیزیکی Rowgroup برای همه پروژههای تجاری مناسب است؟
خیر. سودمندی آن به حجم داده، نسبت خواندن به نوشتن، SLA گزارشها و هزینه نگهداری وابسته است. ارزیابی فنی یا مشاوره SQL Server پیش از استقرار میتواند از هزینههای بازطراحی جلوگیری کند.
هزینه پیادهسازی DMV فیزیکی Rowgroup چگونه برآورد میشود؟
برآورد باید شامل تحلیل Workload، طراحی آزمایش، زمان مهاجرت، پایش پس از اجرا و آموزش تیم باشد. اندازه جدول و حساسیت توقف سرویس نیز روی زمان انجام پروژه اثر مستقیم دارد.
تفاوت DMV فیزیکی Rowgroup با یک ایندکس یا روش عمومی چیست؟
روش عمومی معمولاً فقط ساختار یا دستور را میبیند، اما این موضوع روی sys.dm_db_column_store_row_group_physical_stats، deleted_rows و رفتار واقعی موتور تمرکز دارد. مقایسه باید با Plan، IO، CPU و مدت اجرا انجام شود.
چه زمانی برای اجرای پروژه یا دریافت خدمات مرتبط با Related DMVs: sys.dm_db_column_store_row_group_physical_stats مناسب است؟
هنگامی که گزارشها کند شدهاند، رشد داده سریع است یا نگهداری فعلی نتیجه قابل پیشبینی ندارد، بررسی تخصصی ارزشمند است. بهتر است ابتدا Snapshot فنی و معیار موفقیت تعیین شود.
رایجترین خطا در استفاده از DMV فیزیکی Rowgroup چیست؟
یکی از خطاهای پرتکرار «SELECT * بدون فیلتر در سرور شلوغ» است. خطای دیگر تصمیمگیری بدون مقایسه قبل و بعد و بدون توجه به نسخه SQL Server است.
DMV فیزیکی Rowgroup چه اثری بر Performance دارد؟
اثر اصلی از مسیر فیلتر Object/Index، نمونهبرداری دورهای و Aggregation دیده میشود. نتیجه میتواند بسیار مثبت یا در Workload نامناسب منفی باشد، بنابراین تست کنترلشده ضروری است.
بهترین روش عملی برای DMV فیزیکی Rowgroup چیست؟
از یک محیط آزمایشی مشابه Production شروع کنید، نام جدول و ایندکس را Join کنید و درصدها را با NULLIF بسازید را اجرا کنید و معیارها را در Query Store یا سامانه پایش ثبت نمایید.
سازگاری Related DMVs: sys.dm_db_column_store_row_group_physical_stats با نسخههای SQL Server چگونه است؟
این DMV در SQL Server 2016 و نسخههای بعدی در دسترس است و برای مشاهده کامل ممکن است مجوزهای مشاهده وضعیت پایگاه داده لازم باشد. پیش از انتشار در Production، Syntax و گزینههای قابل پشتیبانی را روی همان Edition، Version و Compatibility Level بررسی کنید.
سؤالات مصاحبه
پاسخ مناسب به پرسشهای زیر باید علاوه بر تعریف، شامل سناریو، Trade-off، معیار اندازهگیری و نمونه T-SQL باشد.
- تفاوت sys.dm_db_column_store_row_group_physical_stats و state_desc را با یک سناریوی واقعی توضیح دهید.
- برای سنجش اثر Related DMVs: sys.dm_db_column_store_row_group_physical_stats چه شاخصهایی را قبل و بعد ثبت میکنید؟
- در چه شرایطی «SELECT * بدون فیلتر در سرور شلوغ» باعث افت کارایی میشود؟
- چگونه با استفاده از total_rows و deleted_rows مشکل را عیبیابی میکنید؟
- در طراحی یک Job سازمانی برای DMV فیزیکی Rowgroup چه کنترل خطا و Rollback در نظر میگیرید؟
- چرا توصیه «نام جدول و ایندکس را Join کنید» برای محیط Production مهم است؟
چکلیست نهایی
- نسخه و Compatibility Level برای Related DMVs: sys.dm_db_column_store_row_group_physical_stats کنترل شد.
- خط پایه IO، CPU، Duration و فضای مصرفی ثبت شد.
- Query و Syntax در محیط آزمایشی اجرا شد.
- اثرات DML و ETL جداگانه سنجیده شد.
- خروجی DMV یا Metadata پس از اجرا بررسی شد.
- Rollback Plan و ظرفیت Log مشخص شد.
- گزارش مقایسه قبل و بعد ذخیره شد.
- Job یا رویه نگهداری دارای شرط و کنترل خطا است.
جمعبندی
DMV فیزیکی Rowgroup زمانی مفید است که از حالت یک دستور منفرد خارج و به یک فرایند اندازهگیریشده تبدیل شود. تابع مدیریتی sys.dm_db_column_store_row_group_physical_stats وضعیت جاری Rowgroupها، تعداد کل و حذفشده، اندازه، دلیل Trim و مسیر انتقال به حالت فشرده را در پایگاه داده جاری گزارش میکند. در عمل باید با نسخه SQL Server، شکل داده و هدف گزارشگیری سازگار شود.
برای مطالعه ارتباط این موضوع با سایر اجزای Columnstore، راهنمای جامع کارایی Columnstore در SQL Server را ببینید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان
قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620
انجام پروژههای برنامهنویسی، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server با رویکرد حرفهای، مستندسازی مناسب و قابلیت توسعه انجام میشود.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما