آموزش جامع Approximate Query Processing در SQL Server؛ پردازش تقریبی پرسوجو
مسئلهای که Approximate Query Processing حل میکند
یک Query ثابت در برابر حجم داده، توزیع پارامتر و وضعیت Cache همیشه رفتار یکسانی ندارد. Approximate Query Processing برای همین نوسان ساخته شده و با پذیرش خطای کنترلشده، شمارش متمایز و صدک را سریعتر میکند.
این مقاله از سطح مقدماتی آغاز میکند و پیشنیاز SQL Server 2019 و 2022، Compatibility Level 150، منطق APPROX_COUNT_DISTINCT و Approximation Error، ده آزمایش عملی و روش تصمیمگیری برای Production را پوشش میدهد.
مثالها را در پایگاه آزمایشی اجرا کنید؛ برای مشاهده نتیجه به Actual Execution Plan، مجوز ساخت Object و ترجیحاً Query Store نیاز دارید.
بازگشت به راهنمای جامع Intelligent Query Processing
تعریف و جایگاه موضوع
Approximate Query Processing یا پردازش تقریبی پرسوجو در خانواده Intelligent Query Processing قرار میگیرد. با پذیرش خطای کنترلشده، شمارش متمایز و صدک را سریعتر میکند. سیگنالهای اصلی آن APPROX_COUNT_DISTINCT, APPROX_PERCENTILE_CONT, Approximation Error, Big Data هستند و نتیجه باید در Plan یا Runtime Stats قابل مشاهده باشد.
سناریوی مناسب، داشبوردهای بزرگ که پاسخ سریع مهمتر از دقت مطلق است است. این قابلیت یک درمان عمومی برای Schema نامناسب، Statistics منقضی یا Predicate غیرSARGable نیست و باید بعد از تشخیص ریشه مسئله انتخاب شود.
این نقشه جایگاه Approximate Query Processing را با محورهای APPROX_COUNT_DISTINCT، Approximation Error و Aggregation نشان میدهد.
نحو، تنظیمات و نوع خروجی
تنظیم پایه
SELECT name,compatibility_level FROM sys.databases WHERE name=DB_NAME();
-- توابع تقریبی با Syntax تابع کنترل میشوند.
نسخه، پارامتر و رفتار ویژه
| مولفه | مقدار | تفسیر |
|---|
| نسخه | SQL Server 2019 و 2022 | نسخه پایه قابلیت |
| Compatibility Level | 150 | شرط فعالشدن Optimizer |
| ورودی | Approximation Error | سیگنال تصمیم |
| خروجی | Plan یا Runtime behavior | نوع داده Query تغییر نمیکند |
| NULL | وابسته به Predicate | آزمون مستقل لازم است |
Approximate Query Processing Return Type مستقلی به برنامه برنمیگرداند؛ نتیجه آن در انتخاب Operator، Variant، Grant، DOP یا زمان Compile دیده میشود. بنابراین خروجی SELECT همان نوع داده عبارت اصلی باقی میماند.
اجزای اصلی و منطق اجرا
1. نقش APPROX_COUNT_DISTINCT
در زنجیره تصمیم Approximate Query Processing، مؤلفه APPROX_COUNT_DISTINCT باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
2. نقش APPROX_PERCENTILE_CONT
در زنجیره تصمیم Approximate Query Processing، مؤلفه APPROX_PERCENTILE_CONT باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
3. نقش Approximation Error
در زنجیره تصمیم Approximate Query Processing، مؤلفه Approximation Error باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
4. نقش Big Data
در زنجیره تصمیم Approximate Query Processing، مؤلفه Big Data باید همراه با Actual Rows، هزینه Operatorهای مجاور و تکرار اجرا تحلیل شود. مشاهده نام یک ویژگی بدون تغییر قابل اندازهگیری، اثبات موفقیت نیست.
این جریان، مسیر Query از APPROX_COUNT_DISTINCT تا مشاهده Aggregation را برای Approximate Query Processing قابل پیگیری میکند.
مثالهای عملی از ساده تا پیشرفته
مثال 1: بررسی سطح سازگاری
پیش از تحلیل Approximate Query Processing سطح سازگاری را ثبت میکنیم.
SELECT DB_NAME() DatabaseName,compatibility_level FROM sys.databases WHERE name=DB_NAME();
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Database | Current |
| Compatibility | 150 |
نکته کاربردی: سطح هدف این مقاله 150 است.
مثال 2: فعالسازی کنترلشده
تنظیم مرتبط با Approximate Query Processing در محیط آزمایشی فعال میشود.
SELECT name,compatibility_level FROM sys.databases WHERE name=DB_NAME();
-- توابع تقریبی با Syntax تابع کنترل میشوند.
SELECT name,value FROM sys.database_scoped_configurations ORDER BY name;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Action | Enable |
| Scope | Database |
نکته کاربردی: Baseline پیش از تغییر را نگه دارید.
مثال 3: ساخت داده نمونه
دادهای متناسب با APPROX_COUNT_DISTINCT و APPROX_PERCENTILE_CONT ساخته میشود.
DROP TABLE IF EXISTS dbo.IQP_AQP; CREATE TABLE dbo.IQP_AQP(ID bigint IDENTITY,VisitorID bigint,LatencyMs int);
INSERT dbo.IQP_AQP(VisitorID,LatencyMs) SELECT TOP (100000) ABS(CHECKSUM(NEWID()))%30000,1+ABS(CHECKSUM(NEWID()))%5000 FROM sys.all_objects a CROSS JOIN sys.all_objects b;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Object | IQP_APPROXIMATE_QU |
| Purpose | پردازش تقریبی پرسوجو |
نکته کاربردی: حجم و Skew را شبیه Production تنظیم کنید.
مثال 4: اجرای سناریوی پایه
Query پایه برای مشاهده Approximation Error اجرا میشود.
SELECT COUNT(DISTINCT VisitorID) ExactVisitors,APPROX_COUNT_DISTINCT(VisitorID) ApproxVisitors FROM dbo.IQP_AQP;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Signal | Approximation Error |
| Expected | Inspect actual plan |
نکته کاربردی: Actual Plan را ذخیره کنید.
مثال 5: ثبت XML Plan
ویژگیهای Big Data و Aggregation در Plan بررسی میشوند.
SET STATISTICS XML ON;
SELECT COUNT(DISTINCT VisitorID) ExactVisitors,APPROX_COUNT_DISTINCT(VisitorID) ApproxVisitors FROM dbo.IQP_AQP;
SET STATISTICS XML OFF;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Artifact | Actual XML Plan |
| Inspect | Aggregation |
نکته کاربردی: Estimated Plan برای Feedback کافی نیست.
مثال 6: تکرار اجرا
برای شکلگیری تاریخچه Approximate Query Processing چند اجرای متوالی انجام میشود.
DECLARE @i int=1; WHILE @i<=6 BEGIN
SELECT COUNT(DISTINCT VisitorID) ExactVisitors,APPROX_COUNT_DISTINCT(VisitorID) ApproxVisitors FROM dbo.IQP_AQP;
SET @i+=1; END;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Executions | 6 |
| Observation | Runtime evolution |
نکته کاربردی: بین اجراها Cache را بیدلیل پاک نکنید.
مثال 7: تحلیل Query Store
Runtime Stats و Planهای Approximate Query Processing از Query Store خوانده میشوند.
ALTER DATABASE CURRENT SET QUERY_STORE=ON;
SELECT TOP (20) q.query_id,p.plan_id,p.is_forced_plan,rs.count_executions,rs.avg_duration,rs.avg_cpu_time,rs.avg_logical_io_reads
FROM sys.query_store_query_text qt JOIN sys.query_store_query q ON q.query_text_id=qt.query_text_id
JOIN sys.query_store_plan p ON p.query_id=q.query_id JOIN sys.query_store_runtime_stats rs ON rs.plan_id=p.plan_id
WHERE qt.query_sql_text LIKE N'%IQP_APPROXIMATE_%' ORDER BY rs.last_execution_time DESC;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Repository | Query Store |
| Metrics | CPU, IO, Duration |
نکته کاربردی: بازههای زمانی همسان را مقایسه کنید.
مثال 8: آزمون NULL و حالت مرزی
شاخه کمانتخاب یا NULL برای Approximate Query Processing آزمایش میشود.
SELECT APPROX_COUNT_DISTINCT(CASE WHEN LatencyMs>100000 THEN VisitorID END) EmptyApprox FROM dbo.IQP_AQP;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Case | NULL / Edge |
| Expected | No error |
نکته کاربردی: حالت مرزی را در Regression Test نگه دارید.
مثال 9: مقایسه A/B
اثر Approximate Query Processing با خاموش و روشنکردن کنترلشده مقایسه میشود.
SELECT name,compatibility_level FROM sys.databases WHERE name=DB_NAME();
-- توابع تقریبی با Syntax تابع کنترل میشوند.
SELECT COUNT(DISTINCT VisitorID) ExactVisitors,APPROX_COUNT_DISTINCT(VisitorID) ApproxVisitors FROM dbo.IQP_AQP;
SELECT name,compatibility_level FROM sys.databases WHERE name=DB_NAME();
-- توابع تقریبی با Syntax تابع کنترل میشوند.
| خروجی یا شاخص | نمونه نتیجه |
|---|
| A | Feature OFF |
| B | Feature ON |
نکته کاربردی: در Production تغییر سراسری بدون Change Plan انجام ندهید.
مثال 10: پایش معیار پذیرش
CPU، IO و Duration برای پذیرش Approximate Query Processing ثبت میشود.
SET STATISTICS IO ON; SET STATISTICS TIME ON;
SELECT COUNT(DISTINCT VisitorID) ExactVisitors,APPROX_COUNT_DISTINCT(VisitorID) ApproxVisitors FROM dbo.IQP_AQP;
SET STATISTICS TIME OFF; SET STATISTICS IO OFF;
| خروجی یا شاخص | نمونه نتیجه |
|---|
| Accept | Lower resource or stable plan |
| Rollback | Prior config |
نکته کاربردی: نتیجه را با SLA و Throughput کل سرور بسنجید.
کاربردهای واقعی در پروژه
کاربرد شاخص Approximate Query Processing در داشبوردهای بزرگ که پاسخ سریع مهمتر از دقت مطلق است دیده میشود. تیم باید Queryهای کاندید را بر اساس سهم CPU، Duration و Logical Reads اولویتبندی کند و از تغییر همه Queryها یا همه تنظیمات به صورت همزمان پرهیز کند.
در پروژه سازمانی، خروجی مطلوب فقط کاهش زمان یک اجرا نیست. ثبات Plan در ساعات پرترافیک، Throughput کل سامانه، Tail Latency، فشار tempdb و امکان Rollback نیز بخشی از معیار پذیرش هستند.
هشدار مهم نسخه و Eligibility
نام Approximate Query Processing در نسخه SQL Server 2019 و 2022 به معنی استفاده قطعی آن در هر Query نیست. Compatibility Level 150، Build، تنظیم Scoped، شکل Query و Eligibility همزمان تعیینکنندهاند.
پیش از تغییر Production، Cumulative Update، وضعیت Query Store و Hintهای موجود را ثبت کنید. Hint ثابت یا پاکسازی مکرر Cache ممکن است رفتار تطبیقی را محدود کند.
اشتباهات رایج و روش اصلاح
| اشتباه | پیامد | اصلاح عملی |
|---|
| قضاوت با یک اجرا | نتیجه Cache-sensitive | چند اجرای کنترلشده |
| داده یکنواخت | پنهانشدن رفتار تطبیقی | Skew و NULL واقعی |
| پاککردن دائم Cache | حذف Feedback یا Variant | سیاست Cache ثابت |
| تمرکز فقط بر Duration | پنهانشدن CPU و IO | ثبت چند معیار |
| تغییر سراسری | ریسک Regression | Pilot و Rollback |
Performance Considerations
برای Approximate Query Processing، Plan را از نظر APPROX_COUNT_DISTINCT، Approximation Error و Aggregation با Baseline مقایسه کنید. Estimated Rows و Actual Rows، CPU Time، Elapsed Time و Logical Reads باید همزمان خوانده شوند.
- تغییر APPROX_COUNT_DISTINCT را در Actual Plan ثبت کنید.
- اثر Approximation Error را روی انتخاب Plan یا Runtime بسنجید.
- Warm Cache و Cold Cache را جداگانه آزمایش کنید.
- Tail Latency و Throughput را کنار میانگین زمان پاسخ نگه دارید.
- Query Store را از نظر فضای مصرفی و Read Write بودن پایش کنید.
Best Practices
- Query کاندید را با شواهد انتخاب کنید.
- نسخه، Build و تنظیمات را در Change Record ثبت کنید.
- داده تست را از نظر حجم، Skew و NULL شبیه Production بسازید.
- A/B Test را با سیاست Cache یکسان انجام دهید.
- معیار توقف و Rollback Plan را پیش از انتشار تصویب کنید.
- پس از ارتقا یا تغییر Index، نتیجه را دوباره بررسی کنید.
این پنل، Best Path و خطای رایج Approximate Query Processing را کنار CPU، IO و Latency قرار میدهد.
مزایا، محدودیتها و زمان نامناسب استفاده
| جنبه | تحلیل تصمیم |
|---|
| مزیت | تصمیم آگاهتر از Approximation Error |
| محدودیت | وابستگی به نسخه و Eligibility |
| زمان نامناسب | Query کوچک یا مشکل طراحی Schema |
| مکمل | Index، Statistics و Query SARGable |
سؤالات متداول
Approximate Query Processing چه مسئلهای را حل میکند؟
پردازش تقریبی پرسوجو با پذیرش خطای کنترلشده، شمارش متمایز و صدک را سریعتر میکند و برای داشبوردهای بزرگ که پاسخ سریع مهمتر از دقت مطلق است مناسب است.
چگونه استفاده واقعی Approximate Query Processing را تشخیص دهیم؟
Actual Plan، Query Store و شاخصهای APPROX_COUNT_DISTINCT و Aggregation را پیش و پس از اجرا مقایسه کنید.
آیا Approximate Query Processing برای هر سامانه تجاری مناسب است؟
خیر؛ Baseline، SLA، توزیع داده و ریسک Regression باید پیش از استقرار بررسی شوند.
هزینه ارزیابی Approximate Query Processing چگونه برآورد میشود؟
تعداد Queryهای بحرانی، محیط تست، آمادگی Query Store و زمان Regression Test عوامل اصلی هستند.
تفاوت Approximate Query Processing با Tuning دستی چیست؟
این قابلیت بخشی از تصمیم Optimizer را تطبیقی میکند، اما جایگزین Index، Statistics و Query صحیح نیست.
برای اجرای پروژه Approximate Query Processing چه خدماتی لازم است؟
ممیزی Plan، طراحی Benchmark، اجرای A/B، آموزش تیم و سند Rollback خروجیهای کاربردی پروژه هستند.
رایجترین خطای Approximate Query Processing چیست؟
انتظار نتیجه بدون بررسی Compatibility Level 150، Eligibility Query و شواهد Actual Plan رایجترین خطاست.
مهمترین معیار Performance در Approximate Query Processing چیست؟
Duration، CPU، Logical Reads و تغییر Approximation Error باید همزمان تحلیل شوند.
Best Practice استقرار Approximate Query Processing چیست؟
Pilot محدود، داده شبیه Production، معیار پذیرش روشن و Monitoring پس از انتشار بهترین مسیر است.
Approximate Query Processing در کدام نسخه پشتیبانی میشود؟
مبنای این راهنما SQL Server 2019 و 2022 و Compatibility Level 150 است؛ Build دقیق را نیز کنترل کنید.
سؤالات مصاحبه
- چه شواهدی اثر واقعی Approximate Query Processing را ثابت میکند؟
- تغییر Approximation Error چگونه Plan را تحت تأثیر قرار میدهد؟
- چه زمانی خاموشکردن موقت Approximate Query Processing منطقی است؟
- چگونه بهبود یک Query را با Throughput کل سرور متعادل میکنید؟
- Rollback پس از Regression چگونه طراحی میشود؟
چکلیست نهایی
- Compatibility Level 150 بررسی شد.
- Baseline Plan، CPU، IO و Duration ثبت شد.
- Skew، NULL و حالت مرزی آزمایش شد.
- Query Store و فضای آن کنترل شد.
- A/B Test با Cache policy یکسان انجام شد.
- معیار پذیرش و Rollback تصویب شد.
- Monitoring پس از انتشار انجام شد.
جمعبندی
Approximate Query Processing زمانی انتخاب درستی است که مسئله واقعی به Approximation Error و تغییر رفتار اجرا مربوط باشد. آن را یک لایه تطبیقی روی پایه سالم Schema، Statistics و Index در نظر بگیرید، نه جایگزین Tuning اصولی.
گام بعدی اجرای ده آزمایش این مقاله روی Query واقعی و مقایسه Aggregation با Baseline است. برای دیدن ارتباط این قابلیت با سایر اعضای IQP، راهنمای جامع Intelligent Query Processing را مطالعه کنید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان؛ قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620.
انجام پروژه، آموزش برنامهنویسی و آموزش SQL Server توسط مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی تاکنون.
برای سفارش پروژه، آموزش تخصصی، ایتا، واتساپ و تماس مستقیم با ما در ارتباط باشید.
تماس مستقیم با 09131253620
تماس با ما و ثبت درخواست