سؤال

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

أنا أتطلع إلى تسريع هذا الأمر ، لكن لا أريد فهرسة كل عمود أضيفه إلى الفقرة Where - لا أعرف أن إضافة العديد من الفهارس ستنتهي تحسين السرعة (أو أنا خاطئ - ظلم - يظلم؟). لذلك أنا فضولي ما هي أفضل الممارسات إذا كنت لا يمكن إضافة أي فهارس جديدة إلى الجدول!

الإجراء المخزن لا يبدو أنه أفضل ملاءمة. قد تكون طريقة العرض المفهرسة هي أفضل فكرة؟ أفكار؟

ها هو مخطط الجدول:

DeviceGuid (PK, uniqueidentifier, not null)
DeviceID (int, not null)
WindowsEventID (PK, int, not null) (indexed)
EventLog (varchar(64), not null)
EventSource (varchar(64), not null)
EventID (int, not null)
Severity (int, not null)
Description (nvarchar(max), not null)
TimeOfEvent (PK, datetime, not null) (indexed)
OccurrenceNbr (int, not null)

إليك عينة استعلام:

SELECT COUNT(*) AS NumOcc, EventID, EventLog, EventSource, Severity, TimeOfEvent, Description
FROM WindowsEvent
WHERE DeviceID='34818'
    AND Severity=1
    AND TimeOfEvent >= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/10/27 12:00:00 AM')
    AND TimeOfEvent <= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/11/3 12:00:00 AM')
    AND EventID<>34113
    AND EventID<>34114
    AND EventID<>34112
    AND EventID<>57755
    AND EventSource<>'AutoImportSvc.exe'
    AND EventLog='Application'
GROUP BY EventID, EventLog, EventSource, Severity, Description
ORDER BY NumOcc DESC

ربما تمتص الاستعلام ... يعود 53 صفًا في 4.5 دقيقة.

هل كانت مفيدة؟

المحلول 3

كان الحل النهائي هنا هو تشغيل استعلام مقابل الحقول المفهرسة ، ثم تصفيةها داخل التطبيق الذي يدير الاستعلام. انتهى الأمر بحقلان يحتويان على معلومات متشابهة بما يكفي يمكنني الاستعلام عنها مقابل فهرس واحد والحصول على تقريب وثيق للبيانات التي أردتها. لقد قمت بإعادة حلقات وأزال أي كيانات غير متطابقة من قائمة النتائج. استغرق وقتا أقل بكثير!

نصائح أخرى

إذا كان استعلامك لا يستخدم أي فهارس فسيكون ذلك سيئًا. لا تحتاج إلى فهرس في كل عمود ، لكنك ستحتاج إلى واحد في العمود الأيمن. بالنظر إلى أن TimeOfEvent قد تم بالفعل فهرسته ، فقد لا يكون الأمر رائعًا لاحتياجاتك.

يعتمد العمود الأيمن على توزيع بياناتك. من المحتمل أن يكون الفهرس الأفضل هو الفهرس الذي يوفر أعلى انتقائية (أي ، عندما تعرف قيمة رئيسية للفهرس ، فإنه يعيد أقل عدد من الصفوف). إذا كنت تعرف العمود الذي يوفر أفضل انتقائية ، فيمكنك تجربة الفهرس عليه.

للمساعدة في تحديد أفضل فهرس ، يمكنك استخدام خطة التنفيذ المقدرة في SSMS. سيساعدك هذا على معرفة الفهرس الذي سيتم استخدامه. بعد إضافة فهرس ، يمكنك تشغيل استعلامك وتقييم النتائج باستخدام خطة التنفيذ. وبالطبع ، فإن مراقبة الوقت المنقضي سيساعد أيضًا.

جرب هذه الطريقة باستخدام خدعة row_number المزدوجة:

SELECT  RN_Desc as NumOcc, *
FROM    (
        SELECT  row_number() Over(partition by EventId order by EventLog, EventSource, Severity, Description) as RN_Asc,
                row_number() Over(partition by EventId order by EventLog desc, EventSource desc, Severity desc, Description desc) as RN_Desc,
                *
        FROM    WindowsEvent 
        WHERE   DeviceID='34818' 
                AND Severity=1 
                AND TimeOfEvent >= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/10/27 12:00:00 AM') 
                AND TimeOfEvent <= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/11/3 12:00:00 AM') 
                AND EventID<>34113 
                AND EventID<>34114 
                AND EventID<>34112 
                AND EventID<>57755 
                AND EventSource<>'AutoImportSvc.exe' 
                AND EventLog='Application' 
        ) t
WHERE   RN_Asc = 1 
ORDER BY NumOcc DESC 

مع هذا ، لا يحتاج المحرك إلى القيام بأي تجمعات فقط تمريرة واحدة عبر الجدول. إذا لم ينجح ، فحاول اللعب مع الطلب وتقسيمه حسب أجزاء من Rownumber للحصول على مجموعات صحيحة.

هذا أمر بسيط للغاية ، لكنني سأحاول القيمة المفهرسة كاختبار أول في

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top