دليل performance tuning

كيفية تحسين أداء SQL Server

يفشل العمل على أداء SQL Server عندما تقفز الفرق مباشرة إلى إعادة بناء الفهارس أو ترقية العتاد. الطريق الأفضل هو قياس الـ waits المهيمنة والتحقق من الإحصاءات ومراجعة استراتيجية الفهارس ثم فقط ضبط الخطط والذاكرة و TempDB والتخزين وفقًا لما يفعله الحمل فعليًا.

ابدأ بالأدلة لا بالافتراضات

تحسين الأداء هو مشكلة ترتيب. إذا كان المحرك يقضي معظم وقته في انتظار locks أو memory grants أو log flushes أو تأخير I/O، فيجب أن تعكس كل خطوة لاحقة ذلك. أسرع طريقة لإضاعة الوقت هي التحسين بشكل معزول دون تحديد عنق الزجاجة المسيطر والـ statements التي تسببه.

قاعدة عملية: إذا بدأت خطة التحسين بإعادة بناء جميع الفهارس، فقد تخطيت مرحلة التشخيص.

????? ??? ??? ???? SQL Server

???? ??? ??????? ????? ????? ?? ??????: ????? ??? ???????? ??????? ?? ?????????? ?? ??????? ??? ??? statements ???? ?????? ??????? ??????.

???? ?? wait statistics

sql

??? ??????? ????? ???? ?????? ??? ???? SQL Server ???? ??? ????? ??????? ?? ?????????.

SELECT TOP (10)
    wait_type,
    waiting_tasks_count,
    wait_time_ms / 1000.0 AS wait_time_seconds,
    max_wait_time_ms / 1000.0 AS max_wait_seconds,
    signal_wait_time_ms / 1000.0 AS signal_wait_seconds
FROM sys.dm_os_wait_stats
WHERE wait_type NOT LIKE 'SLEEP%'
  AND wait_type NOT IN ('CLR_SEMAPHORE', 'LAZYWRITER_SLEEP', 'XE_TIMER_EVENT')
ORDER BY wait_time_ms DESC;

????? ????????? ??? ???? ???? ???????

sql

????? ???? ????????? ????? ?????? ???? ????? ?????? ??? ????????? ???? ???? ?? ????? ????? ??????.

UPDATE STATISTICS dbo.SalesOrderHeader
WITH FULLSCAN;

SELECT
    s.name AS stats_name,
    sp.last_updated,
    sp.rows,
    sp.rows_sampled,
    sp.modification_counter
FROM sys.stats AS s
CROSS APPLY sys.dm_db_stats_properties(s.object_id, s.stats_id) AS sp
WHERE s.object_id = OBJECT_ID('dbo.SalesOrderHeader')
ORDER BY sp.last_updated DESC;

?????? ??? statements ??????? ?? plan cache

sql

?????? ??? ?????? ??????????? ???? ????? ??????? ??? ????? ?? ????? ????? ??????? ?? stored procedures.

SELECT TOP (20)
    qs.execution_count,
    qs.total_worker_time / 1000 AS total_cpu_ms,
    qs.total_elapsed_time / 1000 AS total_duration_ms,
    qs.total_logical_reads,
    qs.total_logical_writes,
    DB_NAME(st.dbid) AS database_name,
    OBJECT_NAME(st.objectid, st.dbid) AS object_name,
    SUBSTRING(
        st.text,
        (qs.statement_start_offset / 2) + 1,
        (
            (CASE qs.statement_end_offset
                WHEN -1 THEN DATALENGTH(st.text)
                ELSE qs.statement_end_offset
            END - qs.statement_start_offset
            ) / 2
        ) + 1
    ) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
ORDER BY qs.total_worker_time DESC;

تسلسل عملي للتحسين

الخطوة 1

اقرأ waits والمستهلكين الرئيسيين أولاً

راجع فئات الـ waits والاستعلامات المكلفة و memory grants وضغط CPU والـ statements ذات I/O المرتفع قبل تغيير الإعدادات أو الصيانة.

الخطوة 2

أصلح الإحصاءات القديمة

التحديث التلقائي لا يكفي دائمًا في الجداول الكبيرة أو غير المتوازنة. راجع أنماط تعديل الصفوف وحدّث حيث تكون تقديرات cardinality خاطئة بوضوح.

الخطوة 3

راجع استراتيجية الفهارس لا التجزئة فقط

حدد التغطية المفقودة والفهارس المكررة وغير المستخدمة والتعريفات الواسعة أكثر من اللازم قبل الاختيار بين rebuild و reorganize.

الخطوة 4

افحص خطط التنفيذ وحساسية المعلمات

التقديرات السيئة واختيارات joins الضعيفة و spills والتحويلات الضمنية و parameter sniffing تفسر المشكلات غالبًا أفضل من الإعدادات العامة.

الخطوة 5

راجع TempDB والذاكرة و I/O معًا

Spills و version store و latch contention وضغط السجل وزمن التخزين تتفاعل معًا. إصلاح عنصر واحد بمعزل قد يخفي عنق الزجاجة الحقيقي.

ما الذي يجب مراجعته عمليًا

مراجعة الاستعلامات والإحصاءات

  • - أهم waits حسب الزمن والاتجاه وليس اللقطة الحالية فقط
  • - الـ statements الأعلى في CPU أو القراءات أو المدة أو عدد التنفيذ
  • - الجداول التي تغيّر حجمها بما يكفي لإفساد التقديرات
  • - خطط تحتوي على scans أو spills أو تحويلات ضمنية أو اختيارات joins سيئة

مراجعة تشغيلية وفيزيائية

  • - فهارس مفقودة أو مكررة أو غير مستخدمة أو متداخلة
  • - تصميم TempDB وحمل version store وأنماط spill
  • - Memory grants وضغط buffer وسلوك checkpoints أو log writes
  • - زمن التخزين وإعدادات النمو والضغط على نوافذ الصيانة

أين يساعد الذكاء الاصطناعي في عمليات SQL Server الحديثة

الذكاء الاصطناعي لا يستبدل أساسيات الضبط، لكنه يساعد على ملاحظة التغيرات مبكرًا وترتيب أولويات التحقيق.

كشف شذوذ الحمل

استخدم أنماط القياسات لاكتشاف التحولات المفاجئة في waits أو throughput أو latency قبل أن يبلّغ المستخدمون عن بطء.

التنبؤ بالسعة

نمذج نمو I/O والتخزين والتزامن حتى تخطط الفرق قبل أن يسبب reporting cycle أو feature جديد ضغطًا.

Triage تشغيلي

اجمع الأعراض المتكررة ولخّص العوامل المحتملة وقلّص الطريق من التنبيه إلى المجموعة الصغيرة من الاستعلامات والموارد التي تستحق التحقيق.

حسّن النظام بالترتيب الصحيح

الفكرة الأهم هي التسلسل. الـ waits تُظهر أين يضيع الوقت. الإحصاءات تُظهر ما إذا كان المُحسّن حصل على فرصة عادلة. مراجعة الفهارس تُظهر ما إذا كان مسار الوصول يدعم الحمل. والخطط و TempDB والذاكرة و I/O تُظهر ما إذا كان المحرك يدفع تكلفة مرتفعة لتنفيذ المسار المختار.

عندما تتبع الفرق هذا الترتيب، يصبح الضبط أكثر تكرارًا وأقل اعتمادًا على التخمين. وهكذا يتحول عمل أداء SQL Server إلى عملية هندسية بدل أن يكون طقسًا متكررًا.

الأسئلة الشائعة

ما الذي يجب فحصه أولاً عندما يكون SQL Server بطيئًا؟

ابدأ بالـ waits والاستعلامات الأعلى استهلاكًا للموارد والتغيرات الأخيرة في الحمل. هذا يعطيك اتجاهًا قبل تعديل الفهارس أو الإعدادات أو العتاد.

كم مرة يجب تحديث الإحصاءات في SQL Server؟

لا توجد وتيرة واحدة تناسب جميع الأنظمة. الجداول الكبيرة أو غير المتوازنة تحتاج غالبًا إلى تحديثات موجهة بعد تغييرات بيانات مهمة.

هل تجزئة الفهارس هي السبب الرئيسي لضعف الأداء؟

غالبًا لا. التغطية المفقودة، ترتيب المفاتيح الضعيف، الفهارس المكررة، التقديرات السيئة، حساسية المعلمات وعناقيد TempDB أو I/O تكون أهم في كثير من الحالات.

© 2026 - Ryware.