PAGELATCH_EX در SQL Server | آموزش تحلیل، مثال و رفع مشکل

آموزش جامع تحلیل و رفع انتظار PAGELATCH_EX در SQL Server

توسط admin | گروه SQL Server | 1405/04/31

نظرات 0

آموزش جامع تحلیل و رفع انتظار PAGELATCH_EX در SQL Server

این راهنما یکی از فصل‌های راهنمای جامع Wait Typeهای رایج SQL Server است و انتظار PAGELATCH_EX را از تعریف پایه تا عیب‌یابی حرفه‌ای، مثال‌های اجرایی و تصمیم اصلاحی بررسی می‌کند.

مقدمه و اهمیت مسئله

PAGELATCH_EX یکی از Wait Typeهای مرتبط با «Latch حافظه و صفحه داغ» است. Wait Stats زبان مشاهده توقف‌های درونی موتور SQL Server هستند، اما هر توقف الزاماً مشکل نیست؛ موتور برای I/O، Lock، Worker، حافظه یا هماهنگی بین Taskها به‌طور طبیعی منتظر می‌ماند. مسئله زمانی آغاز می‌شود که نرخ و مدت انتظار با کندی واقعی، افت Throughput یا نقض SLA هم‌زمان شود.

PAGELATCH_EX یعنی worker برای Exclusive Latch روی صفحه‌ای در حافظه و بدون I/O منتظر است. Last-page insert در ایندکس ترتیبی، صفحه تخصیص tempdb یا Queue Table کوچک از سناریوهای شناخته‌شده هستند. در یک عیب‌یابی قابل اتکا باید سه سطح از هم جدا شوند: آمار تجمعی Instance، Request و Task فعال در لحظه، و شاخص تخصصی زیرسیستم. این تفکیک مانع آن می‌شود که یک مقدار قدیمی یا طبیعی به‌عنوان Root Cause معرفی شود.

اثر کسب‌وکاری این انتظار می‌تواند چنین باشد: افت مقیاس‌پذیری INSERT و افزایش زمان پاسخ با زیاد شدن هسته‌ها و Sessionها. هدف مقاله صفر کردن PAGELATCH_EX نیست؛ هدف این است که سهم زیان‌آور آن مشخص، علت قابل کنترل پیدا و نتیجه اصلاح با داده قبل و بعد اثبات شود.

تعریف فنی PAGELATCH_EX

PAGELATCH_EX یعنی worker برای Exclusive Latch روی صفحه‌ای در حافظه و بدون I/O منتظر است. Last-page insert در ایندکس ترتیبی، صفحه تخصیص tempdb یا Queue Table کوچک از سناریوهای شناخته‌شده هستند. نام Wait Type یک برچسب تشخیصی است، نه Error Code و نه دستوری که مستقیماً اجرا شود. شمارنده‌ها از شروع سرویس یا آخرین پاک‌سازی ثبت می‌شوند و ممکن است ساعت‌ها یا روزها رفتارهای متفاوت را در یک مقدار جمع کنند.

قاعده طلایی: PAGELATCH_EX را فقط وقتی اولویت دهید که Delta آن در پنجره کندی رشد کند، Request متاثر پیدا شود و شاخص تخصصی «Latch حافظه و صفحه داغ» همان داستان را تأیید کند.

Query پایه و نحو مشاهده

این Query امن و Read-only، ردیف PAGELATCH_EX را از DMV سراسری Wait Stats می‌خواند. برای اجرای DMVهای سطح Server معمولاً Permission مناسب مشاهده وضعیت سرور یا Permission معادل نسخه لازم است.

SELECT
        wait_type,
        waiting_tasks_count,
        wait_time_ms,
        signal_wait_time_ms
    FROM sys.dm_os_wait_stats
    WHERE wait_type = N'PAGELATCH_EX';

معنای ستون‌های کلیدی

  • wait_type: نام دسته انتظار؛ در این مقاله مقدار هدف PAGELATCH_EX است.
  • waiting_tasks_count: تعداد دفعات آغاز انتظار، نه تعداد Session یکتا.
  • wait_time_ms: کل زمان انتظار و شامل signal_wait_time_ms است.
  • signal_wait_time_ms: زمانی که Task آماده اجرا بوده اما برای Scheduler منتظر مانده است.
  • wait_resource و resource_description: جزئیات منبع فقط در DMVهای Request و Waiting Task ظاهر می‌شوند.

نوع خروجی و دامنه آمار

خروجی DMV مجموعه‌ای از شمارنده‌های bigint و نام انتظار nvarchar است. آمار sys.dm_os_wait_stats در سطح Instance تجمع می‌یابد؛ بنابراین برای نسبت دادن PAGELATCH_EX به یک Database یا Query باید Snapshot لحظه‌ای، متن SQL و داده زیرسیستم را اضافه کرد.

علت‌های رایج و مسیر تشخیص

علت‌های محتمل باید به‌عنوان فرضیه مرتب شوند، نه حکم قطعی. برای PAGELATCH_EX مهم‌ترین فرضیه‌ها عبارت‌اند از:

  • 1. درج هم‌زمان روی آخرین صفحه ایندکس
  • 2. کلید افزایشی و صفحه داغ
  • 3. رقابت تخصیص tempdb
  • 4. Queue Table کوچک با تغییرات پرتعداد

اقدام آغازین پیشنهادی این است: wait_resource و index_operational_stats را برای یافتن فایل، صفحه و ایندکس داغ هم‌بسته کنید. سپس تنها فرضیه‌ای را تغییر دهید که چند شاهد مستقل آن را پشتیبانی می‌کند. برای نمونه، Wait Delta و DMV تخصصی باید با زمان پاسخ برنامه و Query Plan در یک Timeline مشترک قرار گیرند.

با PAGEIOLATCH_EX متفاوت است؛ حذف ایندکس یا تغییر کلید بدون اثبات Last-page contention ریسک بالایی دارد. همچنین ممکن است یک علت بالادستی چند Wait مختلف تولید کند؛ برای مثال Blocking می‌تواند workerها را اشغال و THREADPOOL بسازد، یا Plan پرخوانش هم PAGEIOLATCH و هم فشار CPU ایجاد کند. به همین دلیل رابطه زمانی مهم‌تر از رتبه ساده جدول Waitها است.

مثال‌های عملی و قابل اجرا

مثال 1: خواندن شمارنده تجمعی PAGELATCH_EX

اولین گام این است که وجود و اندازه تاریخی PAGELATCH_EX را ببینید. ستون wait_time_ms شامل signal_wait_time_ms نیز هست و مقدار از زمان Startup یا آخرین پاک‌سازی Wait Stats تجمع یافته است.

SELECT
        wait_type,
        waiting_tasks_count,
        wait_time_ms,
        signal_wait_time_ms,
        CAST(wait_time_ms * 1.0 /
             NULLIF(waiting_tasks_count, 0) AS decimal(18,2)) AS avg_wait_ms
    FROM sys.dm_os_wait_stats
    WHERE wait_type = N'PAGELATCH_EX';
Wait Typeتعدادزمان کلمیانگین
PAGELATCH_EX12,4803,842,000 ms307.85 ms

این خروجی Baseline است و رخداد جاری را اثبات نمی‌کند. زمان Startup، workload و Delta بعدی را ثبت کنید تا درباره اهمیت PAGELATCH_EX نتیجه‌گیری شود.

مثال 2: محاسبه Delta پنج‌ثانیه‌ای PAGELATCH_EX

دو Snapshot کوتاه نشان می‌دهد در بازه مشاهده چه مقدار انتظار جدید ساخته شده است. برای محیط واقعی، بازه را با چرخه کاری سامانه هماهنگ کنید و Snapshotها را در جدول مانیتورینگ پایدار نگه دارید.

IF OBJECT_ID(N'tempdb..#WaitStart') IS NOT NULL
        DROP TABLE #WaitStart;
    
    SELECT wait_type, waiting_tasks_count, wait_time_ms, signal_wait_time_ms
    INTO #WaitStart
    FROM sys.dm_os_wait_stats
    WHERE wait_type = N'PAGELATCH_EX';
    
    WAITFOR DELAY '00:00:05';
    
    SELECT
        w.wait_type,
        w.waiting_tasks_count - ISNULL(b.waiting_tasks_count, 0) AS delta_tasks,
        w.wait_time_ms - ISNULL(b.wait_time_ms, 0) AS delta_wait_ms,
        w.signal_wait_time_ms - ISNULL(b.signal_wait_time_ms, 0) AS delta_signal_ms
    FROM sys.dm_os_wait_stats AS w
    LEFT JOIN #WaitStart AS b ON b.wait_type = w.wait_type
    WHERE w.wait_type = N'PAGELATCH_EX';
Wait TypeDelta TaskDelta WaitDelta Signal
PAGELATCH_EX388,420 ms310 ms

Delta را به نرخ بر ثانیه و تعداد تراکنش نرمال کنید. یک پنجره پنج‌ثانیه‌ای برای آموزش است و در سامانه کم‌ترافیک ممکن است نماینده نباشد.

مثال 3: یافتن Requestهای فعال روی PAGELATCH_EX

وقتی PAGELATCH_EX در لحظه رخ می‌دهد، Session، وضعیت، منبع انتظار و Blocker را یکجا ثبت کنید. این Snapshot به اتصال آمار Instance-level به رخداد واقعی کمک می‌کند.

SELECT
        r.session_id,
        DB_NAME(r.database_id) AS database_name,
        r.status,
        r.command,
        r.wait_time,
        r.wait_resource,
        r.blocking_session_id,
        r.cpu_time,
        r.total_elapsed_time
    FROM sys.dm_exec_requests AS r
    WHERE r.wait_type = N'PAGELATCH_EX'
    ORDER BY r.wait_time DESC;
Sessionپایگاه دادهمنبعزمان
74a00bPAGELATCH_EX resource4,280 ms

اگر خروجی خالی است، انتظار در همان لحظه فعال نیست؛ این موضوع با بالا بودن مقدار تجمعی تناقض ندارد و اهمیت Capture دوره‌ای را نشان می‌دهد.

مثال 4: بررسی Taskها و Contextهای منتظر PAGELATCH_EX

یک Request می‌تواند چند Task داشته باشد، به‌ویژه در Plan موازی. sys.dm_os_waiting_tasks جزئیات worker و resource_description را برای تحلیل سطح پایین‌تر فراهم می‌کند.

SELECT
        wt.session_id,
        wt.exec_context_id,
        wt.wait_duration_ms,
        wt.wait_type,
        wt.blocking_session_id,
        wt.resource_description
    FROM sys.dm_os_waiting_tasks AS wt
    WHERE wt.wait_type = N'PAGELATCH_EX'
    ORDER BY wt.wait_duration_ms DESC;
SessionContextمدتResource
7404,280 msresource details

تعداد Taskها را با DOP، Blocking و ماهیت Latch حافظه و صفحه داغ تفسیر کنید؛ یک Task منفرد و کوتاه با صف گسترده و پایدار یکسان نیست.

مثال 5: نمایش متن SQL عامل PAGELATCH_EX

برای رسیدن از Wait به اقدام اصلاحی باید متن Batch و Statement جاری را ثبت کرد. Offsetها باعث می‌شوند بخش در حال اجرای Batch جدا از متن کامل نمایش داده شود.

SELECT
        r.session_id,
        r.wait_time,
        r.wait_resource,
        SUBSTRING(st.text,
                  (r.statement_start_offset / 2) + 1,
                  ((CASE r.statement_end_offset
                       WHEN -1 THEN DATALENGTH(st.text)
                       ELSE r.statement_end_offset
                    END - r.statement_start_offset) / 2) + 1) AS current_statement,
        st.text AS batch_text
    FROM sys.dm_exec_requests AS r
    OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) AS st
    WHERE r.wait_type = N'PAGELATCH_EX'
    ORDER BY r.wait_time DESC;
SessionWaitStatementBatch
744,280 msSELECT/UPDATE جارینام Procedure یا Batch

متن Query ممکن است اطلاعات حساس داشته باشد؛ آن را در مخزن مانیتورینگ امن نگه دارید و برای اصلاح PAGELATCH_EX حتماً Execution Plan و پارامترها را نیز جمع‌آوری کنید.

مثال 6: یافتن ایندکس دارای Page Latch برای PAGELATCH_EX

index_operational_stats شمارنده‌های Latch را در سطح ایندکس ارائه می‌کند. این گزارش Object و Indexهایی را که بیشترین زمان Page Latch دارند برجسته می‌کند.

SELECT TOP (20)
        DB_NAME(ios.database_id) AS database_name,
        OBJECT_SCHEMA_NAME(ios.object_id, ios.database_id) AS schema_name,
        OBJECT_NAME(ios.object_id, ios.database_id) AS object_name,
        i.name AS index_name,
        ios.page_latch_wait_count,
        ios.page_latch_wait_in_ms
    FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL) AS ios
    LEFT JOIN sys.indexes AS i
      ON i.object_id = ios.object_id
     AND i.index_id = ios.index_id
    WHERE ios.page_latch_wait_count > 0
    ORDER BY ios.page_latch_wait_in_ms DESC;
پایگاه دادهشیءایندکسLatch ms
a00bdbo.OrderQueuePK_OrderQueue184200

اگر یک ایندکس ترتیبی در PAGELATCH_EX غالب باشد، Last-page insert را بررسی کنید؛ برای PAGELATCH_UP صفحات تخصیص tempdb نیز محتمل‌اند.

مثال 7: بازبینی تعداد و اندازه فایل‌های tempdb

رقابت تخصیص tempdb یکی از سناریوهای PAGELATCH_EX است. فایل‌ها باید اندازه و Growth متناسب داشته باشند تا تخصیص به‌صورت متوازن‌تری انجام شود.

SELECT
        file_id,
        name,
        physical_name,
        CAST(size / 128.0 AS decimal(18,2)) AS size_mb,
        CASE WHEN is_percent_growth = 1
             THEN CONCAT(growth, N'%')
             ELSE CONCAT(CAST(growth / 128.0 AS decimal(18,2)), N' MB')
        END AS growth_setting
    FROM tempdb.sys.database_files
    ORDER BY file_id;
File IDناماندازهGrowth
1tempdev8192 MB1024 MB
3temp28192 MB1024 MB

افزودن فایل بیش از نیاز نیز هزینه مدیریت دارد؛ تعداد هسته، نسخه SQL Server و شواهد واقعی Contention را مبنا قرار دهید.

مثال 8: استخراج wait_resource برای صفحه داغ PAGELATCH_EX

wait_resource و resource_description فایل و صفحه مورد رقابت را نشان می‌دهند. تکرار یک شناسه صفحه در Sessionهای متعدد، سرنخ مهمی برای Hot Page است.

SELECT
        r.session_id,
        r.wait_type,
        r.wait_time,
        r.wait_resource,
        wt.resource_description,
        DB_NAME(r.database_id) AS database_name
    FROM sys.dm_exec_requests AS r
    LEFT JOIN sys.dm_os_waiting_tasks AS wt
      ON wt.session_id = r.session_id
     AND wt.exec_context_id = r.request_id
    WHERE r.wait_type = N'PAGELATCH_EX'
    ORDER BY r.wait_time DESC;
SessionWait Resourceتوضیحزمان
762:1:124dbid=2 fileid=1 pageid=1249200 ms

برای صفحه‌های سیستم tempdb، نوع PFS/GAM/SGAM را بررسی کنید؛ برای صفحه ایندکس، Object و الگوی Insert را بیابید.

مثال 9: مقایسه PAGELATCH_EX با Waitهای هم‌خانواده

Wait Typeها در خلأ تفسیر نمی‌شوند. مقایسه PAGELATCH_EX با PAGELATCH_UP، PAGEIOLATCH_EX، BTREE_INSERT_FLOW_CONTROL کمک می‌کند بفهمید علامت اصلی به کدام زیرسیستم نزدیک‌تر است.

SELECT
        wait_type,
        waiting_tasks_count,
        wait_time_ms,
        signal_wait_time_ms,
        CAST(100.0 * wait_time_ms /
             NULLIF(SUM(wait_time_ms) OVER (), 0) AS decimal(10,2)) AS family_percent
    FROM sys.dm_os_wait_stats
    WHERE wait_type IN (N'PAGELATCH_EX', N'PAGELATCH_UP', N'PAGEIOLATCH_EX', N'BTREE_INSERT_FLOW_CONTROL')
    ORDER BY wait_time_ms DESC;
Wait Typeتعدادزمانسهم خانواده
PAGELATCH_EX12,4803,842,000 ms64.20%
PAGELATCH_UP4,1101,820,000 ms30.42%

سهم خانواده برای Prioritization مفید است، ولی شدت کسب‌وکاری را نشان نمی‌دهد. زمان پاسخ، SLA و تعداد درخواست متاثر را هم اضافه کنید.

مثال 10: ساخت قاعده هشدار مستقل برای Delta PAGELATCH_EX

در مانیتورینگ بهتر است روی Delta یک بازه ثابت و نرخ هر ثانیه هشدار بسازید، نه روی مقدار تجمعی از Startup. مثال مستقل زیر با داده نمونه منطق سطح‌بندی را نمایش می‌دهد و در سامانه مانیتورینگ با Snapshot واقعی جایگزین می‌شود.

DECLARE @WindowSeconds int = 60;
    DECLARE @WaitDelta TABLE
    (
        wait_type nvarchar(60),
        delta_wait_ms bigint,
        delta_tasks bigint
    );
    
    INSERT INTO @WaitDelta (wait_type, delta_wait_ms, delta_tasks)
    VALUES (N'PAGELATCH_EX', 8400, 38);
    
    SELECT
        wait_type,
        delta_wait_ms,
        delta_tasks,
        CAST(delta_wait_ms * 1.0 / @WindowSeconds AS decimal(18,2)) AS wait_ms_per_second,
        CASE
            WHEN delta_wait_ms >= 30000 THEN N'بحرانی'
            WHEN delta_wait_ms >= 5000 THEN N'نیازمند بررسی'
            ELSE N'عادی'
        END AS alert_level
    FROM @WaitDelta;
Wait TypeDeltaنرخسطح
PAGELATCH_EX8,400 ms140 ms/sنیازمند بررسی

آستانه‌های نمونه عمومی نیستند. آن‌ها را از Baseline، ظرفیت و SLA سامانه خود استخراج کنید تا برای PAGELATCH_EX هشدار کاذب تولید نشود.

خطاهای رایج در تحلیل

خطای نخست، مرتب کردن sys.dm_os_wait_stats از زمان Startup و معرفی اولین ردیف به‌عنوان علت حادثه است. این کار workloadهای شبانه، Backup، Maintenance و ساعت‌های پرترافیک را مخلوط می‌کند. Snapshot اختلافی با Timestamp و شمارنده workload، تصویری قابل مقایسه می‌سازد.

خطای دوم، صفر کردن شمارنده‌ها پیش از ذخیره Baseline است. پاک‌سازی ممکن است در آزمایش کنترل‌شده مفید باشد، اما روی Production تاریخچه مشترک تیم را از بین می‌برد. روش بهتر ذخیره دو Snapshot و محاسبه Delta در جدول مانیتورینگ است.

خطای سوم، اجرای درمان عمومی برای نام Wait است. درباره PAGELATCH_EX باید این هشدار را جدی گرفت: با PAGEIOLATCH_EX متفاوت است؛ حذف ایندکس یا تغییر کلید بدون اثبات Last-page contention ریسک بالایی دارد. تغییر باید دامنه محدود، معیار موفقیت و Rollback داشته باشد و در سطح Query بر تغییر سراسری ترجیح داده شود، مگر آنکه داده خلاف آن را ثابت کند.

خطای چهارم، نادیده گرفتن Permission، نسخه و تفاوت محیط است. برخی DMVها در Azure یا نسخه‌های قدیمی ستون و دسترسی متفاوت دارند. Queryهای این مقاله Read-only هستند، اما اجرای آن‌ها باید با حساب مانیتورینگ دارای حداقل دسترسی و در پنجره مناسب انجام شود.

ملاحظات کارایی

خود Queryهای DMV معمولاً سبک‌اند، ولی Polling بسیار سریع، دریافت مکرر متن و Plan همه Sessionها یا نگهداری بدون سیاست داده مانیتورینگ هزینه ایجاد می‌کند. برای PAGELATCH_EX فاصله نمونه‌برداری را بر اساس مدت رخداد انتخاب کنید؛ حادثه چندثانیه‌ای به Capture کوتاه‌تر و روند ظرفیت به بازه طولانی‌تر نیاز دارد.

برای مقایسه، Delta را بر ثانیه، تراکنش یا Request نرمال کنید. افزایش مطلق Wait در روزی با دو برابر شدن بار لزوماً Regression نیست. در کنار آن p50، p95، p99، نرخ Timeout، CPU، I/O و Blocking را نگه دارید تا بهینه‌سازی یک معیار، معیار دیگری را خراب نکند.

اگر از Extended Events یا Query Store استفاده می‌کنید، Predicate و Retention محدود انتخاب کنید. ثبت متن و Plan ممکن است داده حساس داشته باشد؛ سطح دسترسی، Masking گزارش و مدت نگهداری باید بخشی از طراحی Performance Monitoring باشد.

بهترین روش‌ها

  • برای PAGELATCH_EX Baseline ساعتی و روزانه متناسب با الگوی بار بسازید.
  • شمارنده تجمعی را به Delta بازه‌ای تبدیل و زمان Startup را همراه Snapshot ذخیره کنید.
  • Wait را به Session، Query، Execution Plan و شاخص زیرسیستم متصل کنید.
  • Waitهای مرتبط مانند PAGELATCH_UP، PAGEIOLATCH_EX، BTREE_INSERT_FLOW_CONTROL را برای یافتن زنجیره علت بررسی کنید.
  • هر بار فقط یک تغییر قابل سنجش اعمال و نتیجه را روی workload هم‌سطح مقایسه کنید.
  • درمان Query-level را پیش از تغییر سراسری Instance ارزیابی کنید.
  • برای تغییر تنظیمات، Script بازگشت و معیار توقف مشخص داشته باشید.
  • گزارش فنی را به SLA و اثر کاربر نهایی پیوند دهید.

سناریوی واقعی سازمانی

فرض کنید سامانه a00b در ساعت اوج کند می‌شود و PAGELATCH_EX در فهرست Waitها بالاست. تیم ابتدا به‌جای Restart یا تغییر تنظیمات، دو Snapshot شصت‌ثانیه‌ای می‌گیرد، Sessionهای فعال را ثبت و مشخص می‌کند رشد انتظار دقیقاً با کدام Endpoint یا Job هم‌زمان است.

در مرحله دوم، شاخص‌های «Latch حافظه و صفحه داغ» و Query Plan بررسی می‌شوند. فرضیه‌های اصلی عبارت‌اند از درج هم‌زمان روی آخرین صفحه ایندکس، کلید افزایشی و صفحه داغ، رقابت تخصیص tempdb. تیم یک اصلاح محدود را در محیط مشابه اجرا، workload یکسان را تکرار و Delta انتظار، p95 و مصرف منابع را با Baseline مقایسه می‌کند.

موفقیت فقط با پایین آمدن رتبه PAGELATCH_EX اعلام نمی‌شود؛ باید افت مقیاس‌پذیری INSERT و افزایش زمان پاسخ با زیاد شدن هسته‌ها و Sessionها کاهش یافته باشد و Regression جدید در Waitهای مرتبط یا صحت خروجی ایجاد نشود. همین چرخه اندازه‌گیری، فرضیه، تغییر و اعتبارسنجی، عیب‌یابی را از حدس به مهندسی قابل دفاع تبدیل می‌کند.

سؤالات متداول

سؤال 1: PAGELATCH_EX دقیقاً چه زمانی در SQL Server ثبت می‌شود؟

PAGELATCH_EX یعنی worker برای Exclusive Latch روی صفحه‌ای در حافظه و بدون I/O منتظر است. Last-page insert در ایندکس ترتیبی، صفحه تخصیص tempdb یا Queue Table کوچک از سناریوهای شناخته‌شده هستند. ثبت یک انتظار کوتاه بخشی طبیعی از زمان‌بندی موتور است؛ اهمیت زمانی ایجاد می‌شود که Delta آن با کندی قابل مشاهده و افت SLA هم‌زمان باشد.

سؤال 2: برای شروع تحلیل PAGELATCH_EX کدام DMVها مناسب‌اند؟

sys.dm_os_wait_stats برای روند Instance، sys.dm_exec_requests برای Request جاری و sys.dm_os_waiting_tasks برای Task و منبع انتظار نقطه شروع هستند. با توجه به دسته Latch حافظه و صفحه داغ باید DMV تخصصی همان زیرسیستم و Execution Plan نیز افزوده شود.

سؤال 3: آیا زیاد بودن PAGELATCH_EX به معنی نیاز فوری به سخت‌افزار جدید است؟

خیر. با PAGEIOLATCH_EX متفاوت است؛ حذف ایندکس یا تغییر کلید بدون اثبات Last-page contention ریسک بالایی دارد. پیش از خرید باید هزینه اصلاح Query، تنظیمات، معماری برنامه و زیرساخت با اندازه‌گیری قبل و بعد مقایسه شود؛ یک ارزیابی فنی حرفه‌ای می‌تواند از هزینه اشتباه جلوگیری کند.

سؤال 4: چه زمانی تحلیل حرفه‌ای PAGELATCH_EX برای یک کسب‌وکار توجیه دارد؟

وقتی انتظار با افت فروش، Timeout، ناتمام ماندن Job، افزایش زمان پاسخ یا نقض SLA هم‌بسته است، تحلیل ساختاریافته ارزش تجاری دارد. مشاوره SQL Server در این مرحله باید خروجی قابل سنجش مانند کاهش p95 و نرخ انتظار ارائه کند، نه فقط تغییر چند تنظیم.

سؤال 5: تفاوت PAGELATCH_EX با PAGELATCH_UP چیست؟

PAGELATCH_EX در دسته Latch حافظه و صفحه داغ تفسیر می‌شود، در حالی که PAGELATCH_UP مرحله یا منبع متفاوتی را برجسته می‌کند. هم‌زمانی این دو ممکن است زنجیره علت و معلول باشد؛ تعریف هر Wait، منبع جاری و Timeline تعیین می‌کند کدام‌یک علامت و کدام‌یک علت نزدیک‌تر است.

سؤال 6: برای سفارش پروژه کاهش PAGELATCH_EX چه داده‌هایی باید آماده شود؟

بازه دقیق کندی، نسخه و Edition، Wait Delta، Query و Plan، شاخص‌های سیستم‌عامل، توپولوژی و SLA را آماده کنید. حذف اطلاعات حساس و فراهم کردن نمونه قابل بازتولید باعث می‌شود خدمت عیب‌یابی سریع‌تر، کم‌ریسک‌تر و قابل ارزیابی باشد.

سؤال 7: رایج‌ترین خطای تشخیصی درباره PAGELATCH_EX چیست؟

قضاوت با مقدار تجمعی از زمان Startup و تغییر تنظیمات بدون اتصال انتظار به Query و بازه حادثه رایج‌ترین خطاست. با PAGEIOLATCH_EX متفاوت است؛ حذف ایندکس یا تغییر کلید بدون اثبات Last-page contention ریسک بالایی دارد. Snapshot کوتاه، Baseline و مقایسه قبل و بعد این خطا را کاهش می‌دهد.

سؤال 8: اثر PAGELATCH_EX بر Performance چگونه اندازه‌گیری می‌شود؟

Delta wait_time_ms، تعداد Task، متوسط انتظار و نرخ بر ثانیه را کنار throughput، p95 زمان پاسخ و منابع سیستم ثبت کنید. افت مقیاس‌پذیری INSERT و افزایش زمان پاسخ با زیاد شدن هسته‌ها و Sessionها بنابراین معیار فنی باید به معیار تجربه کاربر یا Job کسب‌وکار متصل شود.

سؤال 9: Best Practice اصلی برای مدیریت PAGELATCH_EX چیست؟

wait_resource و index_operational_stats را برای یافتن فایل، صفحه و ایندکس داغ هم‌بسته کنید. تغییر را ابتدا در محیط آزمایش یا روی دامنه محدود اعمال کنید، معیار موفقیت را از قبل بنویسید و امکان بازگشت داشته باشید. پاک کردن Wait Stats بدون ذخیره Baseline یا اجرای چند تغییر هم‌زمان قابلیت استناد نتیجه را از بین می‌برد.

سؤال 10: PAGELATCH_EX با کدام نسخه‌های SQL Server سازگار است؟

گزینه OPTIMIZE_FOR_SEQUENTIAL_KEY از SQL Server 2019 برای برخی سناریوها مفید است. ستون‌ها و Permissionهای DMV ممکن است میان نسخه‌های On-premises، Azure SQL و نسخه‌های جدید تغییر کنند؛ Query تشخیصی را در مستندات همان نسخه کنترل و ابتدا با دسترسی Read-only مناسب اجرا کنید.

سؤالات مصاحبه SQL Server

پرسش مصاحبه 1: اگر PAGELATCH_EX بالاترین Wait باشد، آیا آن را Root Cause می‌دانید؟

پاسخ پیشنهادی: خیر؛ ابتدا بازه، Delta، workload و هم‌بستگی با کندی را ثابت می‌کنم. سپس بر اساس دسته Latch حافظه و صفحه داغ سراغ Request، Plan و شاخص تخصصی می‌روم تا علامت از علت جدا شود.

پرسش مصاحبه 2: چگونه PAGELATCH_EX را بدون پاک کردن Wait Stats تحلیل می‌کنید؟

پاسخ پیشنهادی: دو Snapshot زمان‌دار می‌گیرم، اختلاف شمارنده‌ها را محاسبه و بر ثانیه یا تراکنش نرمال می‌کنم. این روش تاریخچه سایر تیم‌ها را نیز از بین نمی‌برد.

پرسش مصاحبه 3: اولین اقدام کم‌ریسک برای PAGELATCH_EX چیست؟

پاسخ پیشنهادی: wait_resource و index_operational_stats را برای یافتن فایل، صفحه و ایندکس داغ هم‌بسته کنید. جمع‌آوری شواهد Read-only و تعیین Query یا منبع مسئول، پیش از هر تغییر پیکربندی، کم‌ریسک‌ترین اقدام است.

پرسش مصاحبه 4: چه شاخصی موفقیت اصلاح PAGELATCH_EX را ثابت می‌کند؟

پاسخ پیشنهادی: کاهش Delta و زمان پاسخ p95 در workload هم‌سطح، بدون بدتر شدن CPU، I/O، Blocking یا نرخ خطا. یک عدد منفرد در محیط کم‌بار مدرک کافی نیست.

پرسش مصاحبه 5: چه زمانی اصلاح PAGELATCH_EX را Rollback می‌کنید؟

پاسخ پیشنهادی: اگر معیار هدف بهتر نشود، Regression در Plan یا SLA دیگر ایجاد شود، یا فرض اولیه با داده جدید رد شود، تغییر را طبق برنامه بازگشت لغو و Baseline تازه را ثبت می‌کنم.

چک‌لیست نهایی

  1. زمان Startup و مقدار اولیه PAGELATCH_EX ثبت شد.
  2. Delta در بازه نماینده و نرخ بر ثانیه محاسبه شد.
  3. Session، Task، متن Query و Plan مرتبط ذخیره شد.
  4. شاخص تخصصی Latch حافظه و صفحه داغ با Wait هم‌بسته شد.
  5. Waitهای مرتبط PAGELATCH_UP، PAGEIOLATCH_EX، BTREE_INSERT_FLOW_CONTROL بررسی شدند.
  6. اثر کسب‌وکاری و SLA پیش از تغییر اندازه‌گیری شد.
  7. تغییر محدود، معیار موفقیت و Rollback تعریف شد.
  8. آزمون بعد از تغییر روی workload هم‌سطح تکرار شد.

جمع‌بندی

PAGELATCH_EX یک نشانه مهم در دسته Latch حافظه و صفحه داغ است، اما فقط با Timeline و شواهد چندلایه به تصمیم اصلاحی تبدیل می‌شود. تعریف فنی، Delta، Request جاری، شاخص زیرسیستم و اثر SLA را کنار هم قرار دهید. اقدام اول پیشنهادی همچنان این است: wait_resource و index_operational_stats را برای یافتن فایل، صفحه و ایندکس داغ هم‌بسته کنید.

برای مقایسه این انتظار با سایر گلوگاه‌ها، مقاله جامع Wait Typeهای رایج SQL Server و مسیر کامل عیب‌یابی را مطالعه کنید. این رویکرد کمک می‌کند اصلاح PAGELATCH_EX باعث انتقال پنهان مشکل به CPU، I/O، Lock، Memory یا Worker Pool نشود.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620