حذف سگمنت Segment Elimination در SQL Server
حذف سگمنت Segment Elimination در SQL Server
Segment Elimination به موتور اجازه میدهد با استفاده از حداقل و حداکثر ذخیرهشده برای هر Segment، بخشهایی را که قطعاً شرط پرسوجو را برآورده نمیکنند نخواند. کیفیت مرتببودن داده و SARGable بودن شرطها اثر مستقیم دارد. در این راهنما موضوع از سطح مقدماتی تا طراحی عملی، خطاهای رایج، ملاحظات کارایی و سناریوهای نگهداری بررسی میشود.
مخاطب مقاله برنامهنویسان، مدیران پایگاه داده و تحلیلگرانی هستند که میخواهند Segment Elimination را بدون تصمیمهای حدسی در Microsoft SQL Server بهکار بگیرند. بازگشت به راهنمای جامع کارایی Columnstore در SQL Server
تعریف و جایگاه موضوع
Segment Elimination به موتور اجازه میدهد با استفاده از حداقل و حداکثر ذخیرهشده برای هر Segment، بخشهایی را که قطعاً شرط پرسوجو را برآورده نمیکنند نخواند. کیفیت مرتببودن داده و SARGable بودن شرطها اثر مستقیم دارد.
این قابلیت را باید در کنار مفاهیم Segment Elimination، Min/Max Metadata، Predicate و SARGability تحلیل کرد. تصمیم درست تنها با مشاهده یک Query سریع حاصل نمیشود؛ بلکه نرخ رشد داده، الگوی DML، نحوه بارگذاری، محدودیت منابع و زمان نگهداری نیز باید وارد مدل تصمیم شوند.
نکته نسخه: دامنه انواع دادهای که از Min/Max و حذف Segment بهره میبرند با نسخههای جدید توسعه یافته است؛ رفتار دقیق باید روی نسخه مقصد آزمون شود.
چرا این موضوع مهم است؟
در جداول تحلیلی بزرگ، تفاوت میان طراحی درست و اجرای صرف یک دستور میتواند به اختلاف قابلتوجه در IO، CPU و زمان پاسخ منجر شود. حذف سگمنت وقتی ارزش واقعی ایجاد میکند که با هدف کسبوکار، الگوی Query و ظرفیت زیرساخت هماهنگ باشد.
- فیلتر تاریخ
- فیلتر کلید کسبوکار
- گزارش دورهای
- Ordered CCI
- کاهش IO
به همین دلیل لازم است معیار موفقیت پیش از پیادهسازی تعریف شود. برای نمونه میتوان زمان گزارش ماهانه، تعداد Rowgroupهای کمحجم، درصد ردیفهای حذفشده، حجم Log یا تعداد Segmentهای خواندهشده را بهعنوان شاخص پایه ثبت کرد.
این نمودار اجزای کلیدی «حذف سگمنت» و ارتباط میان Segment Elimination، Min/Max Metadata و Predicate را نشان میدهد.
نحو، اجزا و پارامترهای اصلی
نحو پایه زیر نقطه شروع است. نام شیء، Schema، پارتیشن و گزینهها باید با محیط واقعی جایگزین شوند. در رشتههای فارسی SQL از پیشوند N استفاده شده تا داده یونیکد درست ذخیره شود.
SELECT SUM(Amount) FROM dbo.FactSales WHERE OrderDate >= '20260101' AND OrderDate < '20260201';
اجزای کلیدی
| مفهوم | نقش در موضوع | نکته عملی |
|---|
| Segment Elimination | بخشی از معماری یا رفتار حذف سگمنت | از بازه نیمهباز تاریخ استفاده کنید |
| Min/Max Metadata | بخشی از معماری یا رفتار حذف سگمنت | تبدیل را روی مقدار ثابت انجام دهید |
| Predicate | بخشی از معماری یا رفتار حذف سگمنت | ستون فیلتر اصلی را در ترتیب بارگذاری لحاظ کنید |
| SARGability | بخشی از معماری یا رفتار حذف سگمنت | Actual Plan را بررسی کنید |
| Ordered Columnstore | بخشی از معماری یا رفتار حذف سگمنت | پارتیشنبندی را مکمل بدانید |
| Rowgroup | بخشی از معماری یا رفتار حذف سگمنت | از بازه نیمهباز تاریخ استفاده کنید |
نوع خروجی بسته به موضوع ممکن است یک ساختار ایندکس، Plan اجرایی، مجموعه Rowgroup، شمارنده DMV یا مقدار عددی باشد. همیشه خروجی را با Metadata و Plan واقعی تأیید کنید؛ پیام موفقیت دستور بهتنهایی نشاندهنده بهبود نیست.
فرایند تصمیمگیری و پیادهسازی
- Workload اصلی را مشخص کنید و Queryهای پرتکرار مرتبط با حذف سگمنت را از Query Store یا مانیتورینگ استخراج کنید.
- وضعیت فعلی Min/Max Metadata و Predicate را ثبت کنید تا خط پایه قابل مقایسه باشد.
- Syntax را در محیط آزمایشی اجرا کنید و اثر آن را روی همبستگی ترتیب بارگذاری و SARGable Predicate بسنجید.
- سناریوهای بارگذاری، حذف، بهروزرسانی، گزارشگیری و بازیابی خطا را جداگانه آزمایش کنید.
- پس از تأیید، اجرای Production را با پنجره تغییر، Rollback Plan و گزارش کنترلی انجام دهید.
این روش مرحلهای مانع آن میشود که یک بهبود محلی، هزینه پنهان در ETL یا عملیات تراکنشی ایجاد کند. همچنین مستندسازی خروجیهای قبل و بعد، تصمیمهای نگهداری آینده را قابل دفاع میسازد.
در این جریان، داده از مرحله ورودی عبور میکند، در نقطههای کنترلی مرتبط با Min/Max Metadata و SARGability ارزیابی میشود و سپس نتیجه قابل پایش تولید میگردد.
۱۰ مثال عملی از ساده تا حرفهای
مثال 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;
SELECT SUM(Amount) FROM dbo.FactSalesDemo WHERE OrderDate>='2026-01-01' AND OrderDate<'2026-02-01';
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,137 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 40 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ همبستگی ترتیب بارگذاری را قبل و بعد اندازه بگیرید و اثر آن را روی 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 SUM(Amount) FROM dbo.FactSalesDemo WHERE OrderDate=CONVERT(date,'2026-07-01');
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,274 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 38 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ SARGable Predicate را قبل و بعد اندازه بگیرید و اثر آن را روی 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;
SELECT SUM(Amount) FROM dbo.FactSalesDemo WHERE CustomerID BETWEEN 100 AND 200;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,411 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 36 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ تعداد Segment خواندهشده را قبل و بعد اندازه بگیرید و اثر آن را روی 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 SUM(Amount) FROM dbo.FactSalesDemo WHERE YEAR(OrderDate)=2026;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,548 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 34 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ نوع داده را قبل و بعد اندازه بگیرید و اثر آن را روی 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;
SELECT SUM(Amount) FROM dbo.FactSalesDemo WHERE OrderDate>=DATEFROMPARTS(2026,1,1) AND OrderDate<DATEFROMPARTS(2027,1,1);
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,685 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 32 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ مرتبسازی را قبل و بعد اندازه بگیرید و اثر آن را روی 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 SUM(Amount) FROM dbo.FactSalesDemo WHERE OrderDate IS NOT NULL;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,822 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 30 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ همبستگی ترتیب بارگذاری را قبل و بعد اندازه بگیرید و اثر آن را روی 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 MIN(OrderDate),MAX(OrderDate) FROM dbo.FactSalesDemo;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 25,959 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 28 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ SARGable Predicate را قبل و بعد اندازه بگیرید و اثر آن را روی 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;
SELECT ProductID,SUM(Amount) FROM dbo.FactSalesDemo WHERE OrderDate>='2025-07-01' GROUP BY ProductID;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 26,096 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 26 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ تعداد Segment خواندهشده را قبل و بعد اندازه بگیرید و اثر آن را روی 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;
SET STATISTICS IO ON;
SELECT SUM(Amount) FROM dbo.FactSalesDemo WHERE CONVERT(varchar(10),OrderDate,120)='2026-01-01';
SET STATISTICS IO OFF;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 26,233 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 24 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ نوع داده را قبل و بعد اندازه بگیرید و اثر آن را روی 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;
SET STATISTICS IO ON;
SELECT SUM(Amount) FROM dbo.FactSalesDemo WHERE OrderDate>='2026-01-01' AND OrderDate<'2026-01-02';
SET STATISTICS IO OFF;
| شاخص | خروجی نمونه | تفسیر |
|---|
| وضعیت | COMPRESSED | ساختار برای اسکن تحلیلی آماده است |
| تعداد ردیف | 26,370 | مقدار نمونه برای مقایسه قبل و بعد |
| هزینه منطقی | 22 صفحه | خروجی نمونه و وابسته به محیط واقعی |
نکته فنی: هنگام استفاده از Segment Elimination فقط به موفقبودن دستور اکتفا نکنید؛ مرتبسازی را قبل و بعد اندازه بگیرید و اثر آن را روی Workload واقعی ثبت کنید.
خطاهای رایج
خطاهای زیر در پروژههای واقعی مرتبط با Segment Elimination دیده میشوند. شدت هر خطا به حجم داده و نسخه SQL Server وابسته است، اما اصل کنترل برای همه محیطها یکسان است.
- تابع روی ستون فیلتر
- تبدیل ضمنی
- پراکندگی تصادفی داده
- شرط بسیار گسترده
- اشتباه گرفتن با Partition Elimination
مهمترین هشدار: تابع روی ستون فیلتر. پیش از هر تغییر گسترده، Backup/Restore آزمایشی، ظرفیت Log و امکان بازگشت را بررسی کنید.
ملاحظات کارایی و پایش
برای ارزیابی حذف سگمنت حداقل پنج محور باید همزمان دیده شود: همبستگی ترتیب بارگذاری, SARGable Predicate, تعداد Segment خواندهشده, نوع داده, مرتبسازی. اندازهگیری تنها زمان اجرا ممکن است نتیجه گمراهکننده بدهد، زیرا Cache گرم، Parallelism، Memory Grant و بار همزمان روی نتیجه اثر دارند.
| معیار | چرا مهم است؟ | روش پیشنهادی |
|---|
| همبستگی ترتیب بارگذاری | اثر مستقیم بر کیفیت یا هزینه حذف سگمنت دارد | از بازه نیمهباز تاریخ استفاده کنید |
| SARGable Predicate | اثر مستقیم بر کیفیت یا هزینه حذف سگمنت دارد | تبدیل را روی مقدار ثابت انجام دهید |
| تعداد Segment خواندهشده | اثر مستقیم بر کیفیت یا هزینه حذف سگمنت دارد | ستون فیلتر اصلی را در ترتیب بارگذاری لحاظ کنید |
| نوع داده | اثر مستقیم بر کیفیت یا هزینه حذف سگمنت دارد | Actual Plan را بررسی کنید |
| مرتبسازی | اثر مستقیم بر کیفیت یا هزینه حذف سگمنت دارد | پارتیشنبندی را مکمل بدانید |
یک Snapshot منفرد برای تصمیم بلندمدت کافی نیست. داده پایش را در چند بازه کاری، پس از ETL و در ساعات اوج جمعآوری کنید تا روند واقعی مشخص شود.
این سناریو تفاوت میان اجرای بدون پایش و اجرای مبتنی بر Best Practice را برای حذف سگمنت مقایسه میکند؛ معیارهای اصلی شامل همبستگی ترتیب بارگذاری و SARGable Predicate هستند.
بهترین روشها
- از بازه نیمهباز تاریخ استفاده کنید
- تبدیل را روی مقدار ثابت انجام دهید
- ستون فیلتر اصلی را در ترتیب بارگذاری لحاظ کنید
- Actual Plan را بررسی کنید
- پارتیشنبندی را مکمل بدانید
Best Practice بهمعنای اجرای یک نسخه ثابت برای همه سرورها نیست. باید توصیهها را با اندازه داده، Edition، Compatibility Level، معماری HA/DR و محدودیت پنجره نگهداری تطبیق داد.
پرسشهای متداول
حذف سگمنت دقیقاً چه مشکلی را حل میکند؟
Segment Elimination به موتور اجازه میدهد با استفاده از حداقل و حداکثر ذخیرهشده برای هر Segment، بخشهایی را که قطعاً شرط پرسوجو را برآورده نمیکنند نخواند. کیفیت مرتببودن داده و SARGable بودن شرطها اثر مستقیم دارد. انتخاب آن باید براساس نوع بارکاری و معیارهای قابل اندازهگیری انجام شود.
برای شروع یادگیری Segment Elimination چه پیشنیازی لازم است؟
آشنایی با Execution Plan، ایندکسها و دستورات پایه T-SQL کافی است. سپس باید مفاهیم Min/Max Metadata و Predicate را روی یک پایگاه داده آزمایشی مشاهده کنید.
آیا حذف سگمنت برای همه پروژههای تجاری مناسب است؟
خیر. سودمندی آن به حجم داده، نسبت خواندن به نوشتن، SLA گزارشها و هزینه نگهداری وابسته است. ارزیابی فنی یا مشاوره SQL Server پیش از استقرار میتواند از هزینههای بازطراحی جلوگیری کند.
هزینه پیادهسازی حذف سگمنت چگونه برآورد میشود؟
برآورد باید شامل تحلیل Workload، طراحی آزمایش، زمان مهاجرت، پایش پس از اجرا و آموزش تیم باشد. اندازه جدول و حساسیت توقف سرویس نیز روی زمان انجام پروژه اثر مستقیم دارد.
تفاوت حذف سگمنت با یک ایندکس یا روش عمومی چیست؟
روش عمومی معمولاً فقط ساختار یا دستور را میبیند، اما این موضوع روی Segment Elimination، SARGability و رفتار واقعی موتور تمرکز دارد. مقایسه باید با Plan، IO، CPU و مدت اجرا انجام شود.
چه زمانی برای اجرای پروژه یا دریافت خدمات مرتبط با Segment Elimination مناسب است؟
هنگامی که گزارشها کند شدهاند، رشد داده سریع است یا نگهداری فعلی نتیجه قابل پیشبینی ندارد، بررسی تخصصی ارزشمند است. بهتر است ابتدا Snapshot فنی و معیار موفقیت تعیین شود.
رایجترین خطا در استفاده از حذف سگمنت چیست؟
یکی از خطاهای پرتکرار «تابع روی ستون فیلتر» است. خطای دیگر تصمیمگیری بدون مقایسه قبل و بعد و بدون توجه به نسخه SQL Server است.
حذف سگمنت چه اثری بر Performance دارد؟
اثر اصلی از مسیر همبستگی ترتیب بارگذاری، SARGable Predicate و تعداد Segment خواندهشده دیده میشود. نتیجه میتواند بسیار مثبت یا در Workload نامناسب منفی باشد، بنابراین تست کنترلشده ضروری است.
بهترین روش عملی برای حذف سگمنت چیست؟
از یک محیط آزمایشی مشابه Production شروع کنید، از بازه نیمهباز تاریخ استفاده کنید و تبدیل را روی مقدار ثابت انجام دهید را اجرا کنید و معیارها را در Query Store یا سامانه پایش ثبت نمایید.
سازگاری Segment Elimination با نسخههای SQL Server چگونه است؟
دامنه انواع دادهای که از Min/Max و حذف Segment بهره میبرند با نسخههای جدید توسعه یافته است؛ رفتار دقیق باید روی نسخه مقصد آزمون شود. پیش از انتشار در Production، Syntax و گزینههای قابل پشتیبانی را روی همان Edition، Version و Compatibility Level بررسی کنید.
سؤالات مصاحبه
پاسخ مناسب به پرسشهای زیر باید علاوه بر تعریف، شامل سناریو، Trade-off، معیار اندازهگیری و نمونه T-SQL باشد.
- تفاوت Segment Elimination و Min/Max Metadata را با یک سناریوی واقعی توضیح دهید.
- برای سنجش اثر Segment Elimination چه شاخصهایی را قبل و بعد ثبت میکنید؟
- در چه شرایطی «تابع روی ستون فیلتر» باعث افت کارایی میشود؟
- چگونه با استفاده از Predicate و SARGability مشکل را عیبیابی میکنید؟
- در طراحی یک Job سازمانی برای حذف سگمنت چه کنترل خطا و Rollback در نظر میگیرید؟
- چرا توصیه «از بازه نیمهباز تاریخ استفاده کنید» برای محیط Production مهم است؟
چکلیست نهایی
- نسخه و Compatibility Level برای Segment Elimination کنترل شد.
- خط پایه IO، CPU، Duration و فضای مصرفی ثبت شد.
- Query و Syntax در محیط آزمایشی اجرا شد.
- اثرات DML و ETL جداگانه سنجیده شد.
- خروجی DMV یا Metadata پس از اجرا بررسی شد.
- Rollback Plan و ظرفیت Log مشخص شد.
- گزارش مقایسه قبل و بعد ذخیره شد.
- Job یا رویه نگهداری دارای شرط و کنترل خطا است.
جمعبندی
حذف سگمنت زمانی مفید است که از حالت یک دستور منفرد خارج و به یک فرایند اندازهگیریشده تبدیل شود. Segment Elimination به موتور اجازه میدهد با استفاده از حداقل و حداکثر ذخیرهشده برای هر Segment، بخشهایی را که قطعاً شرط پرسوجو را برآورده نمیکنند نخواند. کیفیت مرتببودن داده و SARGable بودن شرطها اثر مستقیم دارد. در عمل باید با نسخه SQL Server، شکل داده و هدف گزارشگیری سازگار شود.
برای مطالعه ارتباط این موضوع با سایر اجزای Columnstore، راهنمای جامع کارایی Columnstore در SQL Server را ببینید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان
قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620
انجام پروژههای برنامهنویسی، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server با رویکرد حرفهای، مستندسازی مناسب و قابلیت توسعه انجام میشود.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما