Deleted Bitmap در Columnstore SQL Server
Deleted Bitmap در Columnstore SQL Server
در Columnstore حذف ردیف معمولاً بهصورت منطقی ثبت میشود و Deleted Bitmap مشخص میکند کدام ردیفهای فشرده نباید در نتیجه دیده شوند. تجمع حذفهای منطقی میتواند کار اسکن را بیشتر و کیفیت Rowgroup را کمتر کند. در این راهنما موضوع از سطح مقدماتی تا طراحی عملی، خطاهای رایج، ملاحظات کارایی و سناریوهای نگهداری بررسی میشود.
مخاطب مقاله برنامهنویسان، مدیران پایگاه داده و تحلیلگرانی هستند که میخواهند Deleted Bitmap را بدون تصمیمهای حدسی در Microsoft SQL Server بهکار بگیرند. بازگشت به راهنمای جامع کارایی Columnstore در SQL Server
تعریف و جایگاه موضوع
در Columnstore حذف ردیف معمولاً بهصورت منطقی ثبت میشود و Deleted Bitmap مشخص میکند کدام ردیفهای فشرده نباید در نتیجه دیده شوند. تجمع حذفهای منطقی میتواند کار اسکن را بیشتر و کیفیت Rowgroup را کمتر کند.
این قابلیت را باید در کنار مفاهیم Deleted Bitmap، Logical Delete، Rowgroup و Deleted Rows تحلیل کرد. تصمیم درست تنها با مشاهده یک Query سریع حاصل نمیشود؛ بلکه نرخ رشد داده، الگوی DML، نحوه بارگذاری، محدودیت منابع و زمان نگهداری نیز باید وارد مدل تصمیم شوند.
نکته نسخه: موتور در نسخههای جدید میتواند برخی Rowgroupهای دارای حذف زیاد را در پسزمینه ادغام کند، اما پایش Workload همچنان ضروری است.
چرا این موضوع مهم است؟
در جداول تحلیلی بزرگ، تفاوت میان طراحی درست و اجرای صرف یک دستور میتواند به اختلاف قابلتوجه در IO، CPU و زمان پاسخ منجر شود. نقشه بیت حذفشده وقتی ارزش واقعی ایجاد میکند که با هدف کسبوکار، الگوی Query و ظرفیت زیرساخت هماهنگ باشد.
- پایش حذف منطقی
- تصمیم نگهداری
- تحلیل Fragmentation
- بارهای اصلاحی
- پاکسازی Rowgroup
به همین دلیل لازم است معیار موفقیت پیش از پیادهسازی تعریف شود. برای نمونه میتوان زمان گزارش ماهانه، تعداد Rowgroupهای کمحجم، درصد ردیفهای حذفشده، حجم Log یا تعداد Segmentهای خواندهشده را بهعنوان شاخص پایه ثبت کرد.
این نمودار اجزای کلیدی «نقشه بیت حذفشده» و ارتباط میان Deleted Bitmap، Logical Delete و Rowgroup را نشان میدهد.
نحو، اجزا و پارامترهای اصلی
نحو پایه زیر نقطه شروع است. نام شیء، Schema، پارتیشن و گزینهها باید با محیط واقعی جایگزین شوند. در رشتههای فارسی SQL از پیشوند N استفاده شده تا داده یونیکد درست ذخیره شود.
SELECT total_rows, deleted_rows, CAST(100.0 * deleted_rows / NULLIF(total_rows,0) AS decimal(5,2)) AS deleted_pct FROM sys.dm_db_column_store_row_group_physical_stats;
اجزای کلیدی
| مفهوم | نقش در موضوع | نکته عملی |
|---|
| Deleted Bitmap | بخشی از معماری یا رفتار نقشه بیت حذفشده | آستانه را براساس هزینه واقعی تعیین کنید |
| Logical Delete | بخشی از معماری یا رفتار نقشه بیت حذفشده | پارتیشن قدیمی را Switch کنید |
| Rowgroup | بخشی از معماری یا رفتار نقشه بیت حذفشده | روند deleted_rows را ثبت کنید |
| Deleted Rows | بخشی از معماری یا رفتار نقشه بیت حذفشده | REORGANIZE را قبل از REBUILD بسنجید |
| Reorganize | بخشی از معماری یا رفتار نقشه بیت حذفشده | پس از نگهداری مجدد اندازهگیری کنید |
| Rebuild | بخشی از معماری یا رفتار نقشه بیت حذفشده | آستانه را براساس هزینه واقعی تعیین کنید |
نوع خروجی بسته به موضوع ممکن است یک ساختار ایندکس، Plan اجرایی، مجموعه Rowgroup، شمارنده DMV یا مقدار عددی باشد. همیشه خروجی را با Metadata و Plan واقعی تأیید کنید؛ پیام موفقیت دستور بهتنهایی نشاندهنده بهبود نیست.
فرایند تصمیمگیری و پیادهسازی
- Workload اصلی را مشخص کنید و Queryهای پرتکرار مرتبط با نقشه بیت حذفشده را از Query Store یا مانیتورینگ استخراج کنید.
- وضعیت فعلی Logical Delete و Rowgroup را ثبت کنید تا خط پایه قابل مقایسه باشد.
- Syntax را در محیط آزمایشی اجرا کنید و اثر آن را روی درصد حذف و تعداد ردیف باقیمانده بسنجید.
- سناریوهای بارگذاری، حذف، بهروزرسانی، گزارشگیری و بازیابی خطا را جداگانه آزمایش کنید.
- پس از تأیید، اجرای Production را با پنجره تغییر، Rollback Plan و گزارش کنترلی انجام دهید.
این روش مرحلهای مانع آن میشود که یک بهبود محلی، هزینه پنهان در ETL یا عملیات تراکنشی ایجاد کند. همچنین مستندسازی خروجیهای قبل و بعد، تصمیمهای نگهداری آینده را قابل دفاع میسازد.
در این جریان، داده از مرحله ورودی عبور میکند، در نقطههای کنترلی مرتبط با Logical Delete و Deleted Rows ارزیابی میشود و سپس نتیجه قابل پایش تولید میگردد.
۱۰ مثال عملی از ساده تا حرفهای
مثال 1: مثال پایه و اجرای نخست
در این مثال، «نقشه بیت حذفشده» در سناریوی مثال پایه و اجرای نخست بررسی میشود. 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;
DELETE TOP(1000) FROM dbo.FactSalesDemo;
SELECT SUM(deleted_rows) FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,137 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 40 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ درصد حذف را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 2: کار روی داده نمونه واقعی
در این مثال، «نقشه بیت حذفشده» در سناریوی کار روی داده نمونه واقعی بررسی میشود. 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 total_rows,deleted_rows,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 WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,274 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 38 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ تعداد ردیف باقیمانده را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 3: استفاده در SELECT تحلیلی
در این مثال، «نقشه بیت حذفشده» در سناریوی استفاده در SELECT تحلیلی بررسی میشود. 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;
DELETE FROM dbo.FactSalesDemo WHERE OrderDate<'2025-01-01';
SELECT SUM(deleted_rows) FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,411 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 36 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ تعداد Rowgroup را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 4: فیلتر و شرط کاربردی
در این مثال، «نقشه بیت حذفشده» در سناریوی فیلتر و شرط کاربردی بررسی میشود. 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 COUNT(*) AS affected_groups FROM sys.dm_db_column_store_row_group_physical_stats WHERE deleted_rows>0;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,548 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 34 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ هزینه Rebuild را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 5: ترکیب با قابلیت دیگر
در این مثال، «نقشه بیت حذفشده» در سناریوی ترکیب با قابلیت دیگر بررسی میشود. 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;
ALTER INDEX CCI_FactSalesDemo ON dbo.FactSalesDemo REORGANIZE;
SELECT SUM(deleted_rows) FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,685 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 32 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ Background Merge را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 6: رفتار با NULL یا تغییر داده
در این مثال، «نقشه بیت حذفشده» در سناریوی رفتار با NULL یا تغییر داده بررسی میشود. 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,SUM(deleted_rows) AS deleted_rows FROM sys.dm_db_column_store_row_group_physical_stats GROUP BY object_id,index_id;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,822 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 30 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ درصد حذف را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 7: حالت مرزی و کنترل Metadata
در این مثال، «نقشه بیت حذفشده» در سناریوی حالت مرزی و کنترل 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 TOP(10) row_group_id,total_rows,deleted_rows FROM sys.dm_db_column_store_row_group_physical_stats ORDER BY deleted_rows DESC;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,959 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 28 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ تعداد ردیف باقیمانده را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 8: سناریوی گزارشگیری سازمانی
در این مثال، «نقشه بیت حذفشده» در سناریوی سناریوی گزارشگیری سازمانی بررسی میشود. 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;
DELETE FROM dbo.FactSalesDemo WHERE CustomerID BETWEEN 1 AND 100;
SELECT COUNT(*) FROM dbo.FactSalesDemo;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 26,096 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 26 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ تعداد Rowgroup را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 9: روش اشتباه و نسخه اصلاحی
در این مثال، «نقشه بیت حذفشده» در سناریوی روش اشتباه و نسخه اصلاحی بررسی میشود. 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 SUM(total_rows-deleted_rows) AS active_rows FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 26,233 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 24 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ هزینه Rebuild را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
مثال 10: آزمون کارایی و بهینهسازی
در این مثال، «نقشه بیت حذفشده» در سناریوی آزمون کارایی و بهینهسازی بررسی میشود. 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;
ALTER INDEX CCI_FactSalesDemo ON dbo.FactSalesDemo REBUILD;
SELECT SUM(deleted_rows) AS deleted_after FROM sys.dm_db_column_store_row_group_physical_stats WHERE object_id=OBJECT_ID(N'dbo.FactSalesDemo');
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 26,370 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 22 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Deleted Bitmap فقط به موفقبودن دستور اکتفا نکنید؛ Background Merge را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
خطاهای رایج
خطاهای زیر در پروژههای واقعی مرتبط با Deleted Bitmap دیده میشوند. شدت هر خطا به حجم داده و نسخه SQL Server وابسته است، اما اصل کنترل برای همه محیطها یکسان است.
- Rebuild بر اساس یک درصد ثابت برای همه
- نادیده گرفتن اندازه واقعی Rowgroup
- حذف انبوه بدون پنجره
- مقایسه فقط با Fragmentation B-tree
- تفسیر deleted_rows بدون روند
مهمترین هشدار: Rebuild بر اساس یک درصد ثابت برای همه. پیش از هر تغییر گسترده، Backup/Restore آزمایشی، ظرفیت Log و امکان بازگشت را بررسی کنید.
ملاحظات کارایی و پایش
برای ارزیابی نقشه بیت حذفشده حداقل پنج محور باید همزمان دیده شود: درصد حذف, تعداد ردیف باقیمانده, تعداد Rowgroup, هزینه Rebuild, Background Merge. اندازهگیری تنها زمان اجرا ممکن است نتیجه گمراهکننده بدهد، زیرا Cache گرم، Parallelism، Memory Grant و بار همزمان روی نتیجه اثر دارند.
| معیار | چرا مهم است؟ | روش پیشنهادی |
|---|
| درصد حذف | اثر مستقیم بر کیفیت یا هزینه نقشه بیت حذفشده دارد | آستانه را براساس هزینه واقعی تعیین کنید |
| تعداد ردیف باقیمانده | اثر مستقیم بر کیفیت یا هزینه نقشه بیت حذفشده دارد | پارتیشن قدیمی را Switch کنید |
| تعداد Rowgroup | اثر مستقیم بر کیفیت یا هزینه نقشه بیت حذفشده دارد | روند deleted_rows را ثبت کنید |
| هزینه Rebuild | اثر مستقیم بر کیفیت یا هزینه نقشه بیت حذفشده دارد | REORGANIZE را قبل از REBUILD بسنجید |
| Background Merge | اثر مستقیم بر کیفیت یا هزینه نقشه بیت حذفشده دارد | پس از نگهداری مجدد اندازهگیری کنید |
یک Snapshot منفرد برای تصمیم بلندمدت کافی نیست. داده پایش را در چند بازه کاری، پس از ETL و در ساعات اوج جمعآوری کنید تا روند واقعی مشخص شود.
این سناریو تفاوت میان اجرای بدون پایش و اجرای مبتنی بر Best Practice را برای نقشه بیت حذفشده مقایسه میکند؛ معیارهای اصلی شامل درصد حذف و تعداد ردیف باقیمانده هستند.
بهترین روشها
- آستانه را براساس هزینه واقعی تعیین کنید
- پارتیشن قدیمی را Switch کنید
- روند deleted_rows را ثبت کنید
- REORGANIZE را قبل از REBUILD بسنجید
- پس از نگهداری مجدد اندازهگیری کنید
Best Practice بهمعنای اجرای یک نسخه ثابت برای همه سرورها نیست. باید توصیهها را با اندازه داده، Edition، Compatibility Level، معماری HA/DR و محدودیت پنجره نگهداری تطبیق داد.
پرسشهای متداول
نقشه بیت حذفشده دقیقاً چه مشکلی را حل میکند؟
در Columnstore حذف ردیف معمولاً بهصورت منطقی ثبت میشود و Deleted Bitmap مشخص میکند کدام ردیفهای فشرده نباید در نتیجه دیده شوند. تجمع حذفهای منطقی میتواند کار اسکن را بیشتر و کیفیت Rowgroup را کمتر کند. انتخاب آن باید براساس نوع بارکاری و معیارهای قابل اندازهگیری انجام شود.
برای شروع یادگیری Deleted Bitmap چه پیشنیازی لازم است؟
آشنایی با Execution Plan، ایندکسها و دستورات پایه T-SQL کافی است. سپس باید مفاهیم Logical Delete و Rowgroup را روی یک پایگاه داده آزمایشی مشاهده کنید.
آیا نقشه بیت حذفشده برای همه پروژههای تجاری مناسب است؟
خیر. سودمندی آن به حجم داده، نسبت خواندن به نوشتن، SLA گزارشها و هزینه نگهداری وابسته است. ارزیابی فنی یا مشاوره SQL Server پیش از استقرار میتواند از هزینههای بازطراحی جلوگیری کند.
هزینه پیادهسازی نقشه بیت حذفشده چگونه برآورد میشود؟
برآورد باید شامل تحلیل Workload، طراحی آزمایش، زمان مهاجرت، پایش پس از اجرا و آموزش تیم باشد. اندازه جدول و حساسیت توقف سرویس نیز روی زمان انجام پروژه اثر مستقیم دارد.
تفاوت نقشه بیت حذفشده با یک ایندکس یا روش عمومی چیست؟
روش عمومی معمولاً فقط ساختار یا دستور را میبیند، اما این موضوع روی Deleted Bitmap، Deleted Rows و رفتار واقعی موتور تمرکز دارد. مقایسه باید با Plan، IO، CPU و مدت اجرا انجام شود.
چه زمانی برای اجرای پروژه یا دریافت خدمات مرتبط با Deleted Bitmap مناسب است؟
هنگامی که گزارشها کند شدهاند، رشد داده سریع است یا نگهداری فعلی نتیجه قابل پیشبینی ندارد، بررسی تخصصی ارزشمند است. بهتر است ابتدا Snapshot فنی و معیار موفقیت تعیین شود.
رایجترین خطا در استفاده از نقشه بیت حذفشده چیست؟
یکی از خطاهای پرتکرار «Rebuild بر اساس یک درصد ثابت برای همه» است. خطای دیگر تصمیمگیری بدون مقایسه قبل و بعد و بدون توجه به نسخه SQL Server است.
نقشه بیت حذفشده چه اثری بر Performance دارد؟
اثر اصلی از مسیر درصد حذف، تعداد ردیف باقیمانده و تعداد Rowgroup دیده میشود. نتیجه میتواند بسیار مثبت یا در Workload نامناسب منفی باشد، بنابراین تست کنترلشده ضروری است.
بهترین روش عملی برای نقشه بیت حذفشده چیست؟
از یک محیط آزمایشی مشابه Production شروع کنید، آستانه را براساس هزینه واقعی تعیین کنید و پارتیشن قدیمی را Switch کنید را اجرا کنید و معیارها را در Query Store یا سامانه پایش ثبت نمایید.
سازگاری Deleted Bitmap با نسخههای SQL Server چگونه است؟
موتور در نسخههای جدید میتواند برخی Rowgroupهای دارای حذف زیاد را در پسزمینه ادغام کند، اما پایش Workload همچنان ضروری است. پیش از انتشار در Production، Syntax و گزینههای قابل پشتیبانی را روی همان Edition، Version و Compatibility Level بررسی کنید.
سؤالات مصاحبه
پاسخ مناسب به پرسشهای زیر باید علاوه بر تعریف، شامل سناریو، Trade-off، معیار اندازهگیری و نمونه T-SQL باشد.
- تفاوت Deleted Bitmap و Logical Delete را با یک سناریوی واقعی توضیح دهید.
- برای سنجش اثر Deleted Bitmap چه شاخصهایی را قبل و بعد ثبت میکنید؟
- در چه شرایطی «Rebuild بر اساس یک درصد ثابت برای همه» باعث افت کارایی میشود؟
- چگونه با استفاده از Rowgroup و Deleted Rows مشکل را عیبیابی میکنید؟
- در طراحی یک Job سازمانی برای نقشه بیت حذفشده چه کنترل خطا و Rollback در نظر میگیرید؟
- چرا توصیه «آستانه را براساس هزینه واقعی تعیین کنید» برای محیط Production مهم است؟
چکلیست نهایی
- نسخه و Compatibility Level برای Deleted Bitmap کنترل شد.
- خط پایه IO، CPU، Duration و فضای مصرفی ثبت شد.
- Query و Syntax در محیط آزمایشی اجرا شد.
- اثرات DML و ETL جداگانه سنجیده شد.
- خروجی DMV یا Metadata پس از اجرا بررسی شد.
- Rollback Plan و ظرفیت Log مشخص شد.
- گزارش مقایسه قبل و بعد ذخیره شد.
- Job یا رویه نگهداری دارای شرط و کنترل خطا است.
جمعبندی
نقشه بیت حذفشده زمانی مفید است که از حالت یک دستور منفرد خارج و به یک فرایند اندازهگیریشده تبدیل شود. در Columnstore حذف ردیف معمولاً بهصورت منطقی ثبت میشود و Deleted Bitmap مشخص میکند کدام ردیفهای فشرده نباید در نتیجه دیده شوند. تجمع حذفهای منطقی میتواند کار اسکن را بیشتر و کیفیت Rowgroup را کمتر کند. در عمل باید با نسخه SQL Server، شکل داده و هدف گزارشگیری سازگار شود.
برای مطالعه ارتباط این موضوع با سایر اجزای Columnstore، راهنمای جامع کارایی Columnstore در SQL Server را ببینید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان
قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620
انجام پروژههای برنامهنویسی، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server با رویکرد حرفهای، مستندسازی مناسب و قابلیت توسعه انجام میشود.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما