سؤال

ما هي بعض الأشياء التي يمكن القيام به لتحسين أداء الاستعلام استعلام أوراكل دون إنشاء فهارس؟

وهنا هو الاستعلام أحاول تشغيل أسرع:

SELECT c.ClaimNumber, a.ItemDate, c.DTN, b.FilePath
FROM items a,
itempages b,
keygroupdata c
WHERE a.ItemType IN (112,115,189,241)
AND a.ItemNum = b.ItemNum
AND b.ItemNum = c.ItemNum
ORDER BY a.DateStored DESC

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

وشكرا!

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

المحلول

والأولى فما استقاموا لكم فاستقيموا كتابة الاستعلام لتكون ANSI القياسية:

SELECT c.ClaimNumber, a.ItemDate, c.DTN, b.FilePath
FROM items a
INNER JOIN itempages b ON b.ItemNum = a.ItemNum
INNER JOIN keygroupdata c ON c.ItemNum = b.ItemNum
WHERE a.ItemType IN (112,115,189,241)
ORDER BY a.DateStored DESC

وهذا يجعل من السهل قراءة وفهم ما يجري. كما يساعدك على عدم ارتكاب الأخطاء (أي الصليب الانضمام) التي قد تسبب مشاكل كبيرة حقيقية. ثم كنت الحصول على خطة لرؤية ما تقوم به DBMS مع هذا الاستعلام شرح. هل تحاول استخدام بعض المؤشرات؟ هل الانضمام الجداول بشكل صحيح؟

وبعد ذلك كنت مراجعة الجداول التي أعمل معها لمعرفة ما إذا كان هناك أي الفهارس الموجودة بالفعل أنني يمكن أن تستخدم لجعل الاستعلام بلدي بشكل أسرع. وأخيرا كما الجميع قد اقترح فما استقاموا لكم فاستقيموا إزالة جملة ORDER BY وفعل ذلك في التعليمات البرمجية.

نصائح أخرى

واطلب من الطرف الثالث لمؤشره الانضمام الأعمدة، كما ينبغي أن يكون عمله في المقام الأول! دون الفهارس أوراكل ليس لديه ما يذهب على غير القوة الغاشمة.

وأنت قد ترغب في محاولة إنشاء طريقة عرض تتحقق في أي من هذه الجداول. ثم يمكنك إنشاء فهرس على عرض تتحقق من شأنها أن تساعد سرعة الاستعلام (التي من شأنها ثم يتم الاستعلام عن رأي تتحقق بدلا من الجدول الخام).

وبطبيعة الحال، إذا كان يتم تحديث الجدول المصدر وجهة نظركم والفهارس الخاصة بك وسوف تحتاج إلى تحديث.

أولا، والنظر في خطة التنفيذ. هل تعكس بدقة عدد الصفوف التي يتم استردادها في كل مرحلة من مراحل تنفيذ الاستعلام؟ كيف انتقائية هي أصلية "a.ItemType IN (112115189241)"؟ هل تظهر خطة تنفيذ أي استخدام مساحة القرص مؤقت لينضم أو أنواع؟

والواقع، وربما يمكنك تعديل السؤال لتشمل خطة التنفيذ.

وتأكد أيضا من لم يكن لديك التجزئة ينضم تعطيل، والتي هي الحال في بعض الأحيان في أنظمة ضبطها OLTP، لأنها هي الطريقة الأكثر فعالية من equijoining البيانات كبيرة الحجم في أوراكل. أنها يجب أن تظهر في خطة التنفيذ.

ويمكنك محاولة تصفية على نوع العنصر قبل الانضمام الجداول الخاصة بك، كما هو موضح هنا.

إذا كنت تعمل على أوراكل قبل 9I، وهذا من شأنه أن يعطي أحيانا فوائد مثيرة للدهشة.

select 
  c.claimnumber,
  a.itemdate, 
  c.dtn,
  b.filepath
from 
  (
  select itemdate
  from items it
  where it.itemtype in(112,115,189,241)
  ) a
  itempages b,
  keygroupdata c
where a.itemnum = b.itemnum
  and b.itemnum = c.itemnum

ويمكنك أيضا محاولة إضافة تلميحات / <م> + القاعدة / أو / <م> + نأمر / لنرى ماذا سيحدث ... مرة أخرى، لا سيما مع الإصدارات القديمة، هذه سوف أحيانا تعطي نتائج مثيرة للدهشة.

SELECT /*+RULE*/
  c.ClaimNumber, a.ItemDate, c.DTN, b.FilePath
FROM
  items a,
  itempages b,
  keygroupdata c
WHERE a.ItemType IN (112,115,189,241)
  AND a.ItemNum = b.ItemNum
  AND b.ItemNum = c.ItemNum
ORDER BY a.DateStored DESC

إذا المدخلات الاستعلام ثابتة أو يمكن التنبؤ بها (وitemType IN (...))، ثم بديلا سيكون لتشغيل الاستعلام مرة واحدة أو مرتين في اليوم، وتخزين النتائج في جدول المحلي، مع مؤشرات حيثما كان ذلك مناسبا.

وبعد ذلك يمكنك جعل الاستعلام مكلفا "حاليا" والحصول على نتائج أسرع / أفضل للاستعلام التفاعلي.

وهذا هو استعلام التي تقوم بتشغيل في كثير من الأحيان؟ ويبدو ان الامر سيكون في مصلحة المالك DB لإنشاء الفهارس التي تحتاج إلى سرعة هذا الاستعلام تصل. الدقائق 3.5 كنت تنفق تشغيل الاستعلام يجب أن يكون له بعض التأثير على البيئة إنتاجها!

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

وراجع للشغل، ما الذي يسمح لها بأن تفعل؟ فقط اقرأ؟ إذا يمكنك إنشاء الجداول المؤقتة ووضع الفهارس على تلك، وأنا قد تنظر في تقديم نسخة مؤقتة من الجدول، فهرسة تلك، ومن ثم القيام الانضمام مع النسخ درجة الحرارة ساعد المؤشر.

وأعرف أن هذا موضوع قديم جدا، ولكن لمحركات البحث ما زلت أرغب في تقديم حل بديل من شأنها أن تعمل على أوراكل واعتمادا على البيانات قد يكون أسرع بكثير.

with a as (
  select 
    * 
  from 
    items 
  where 
    ItemType IN (112,115,189,241)
)
SELECT 
  c.ClaimNumber
  , a.ItemDate
  , c.DTN, b.FilePath
FROM 
  a,
  itempages b,
  keygroupdata c
WHERE 
  a.ItemNum = b.ItemNum
  AND b.ItemNum = c.ItemNum
ORDER BY 
  a.DateStored DESC

ويمكنك أيضا محاولة التلميح /*+ MATERIALIZE */ في بند WITH.

والواقع أجد جملة الانضمام القديم أوراكل أسهل بكثير في القراءة من ANSI SQL ^^

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

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

وعلى سبيل المثال، كنت قد حصلت A.ItemNum = B.ItemNum وB.ItemNum = C.ItemNum. حاول إضافة A.ItemNum = C.ItemNum كذلك. أنا متأكد، مع ذلك، أن محسن هو ذكي بما فيه الكفاية لهذا الرقم من تلقاء نفسها - يستحق على الرغم من محاولة

.

واعتمادا على نوع البيانات من العمود تشير itemtype قد تواجهك أسرع المنفذة باستخدام التالية اذا كان لVARCHAR، وأوراكل القيام التحويلات implict.

SELECT c.ClaimNumber, a.ItemDate, c.DTN, b.FilePath
FROM items a,
itempages b,
keygroupdata c
WHERE ((a.ItemType IN ('112','115','189','241'))
AND (a.ItemNum = b.ItemNum)
AND (b.ItemNum = c.ItemNum))
ORDER BY a.DateStored DESC

هل إحصاءات تجمع على هذه الجداول؟ إن لم يكن، وجمع الإحصاءات قد تغيير خطة التنفيذ، على الرغم من أنه لن يكون بالضرورة نحو الأفضل.

وبصرف النظر عن ذلك، والنظر في خطة التنفيذ. قد ترى أنه هو الانضمام إلى الجداول في ترتيب غير الأمثل (على سبيل المثال، يمكن أن يكون الانضمام b و c قبل الانضمام مع الذي لديه حالة فلتر).

هل يمكن استخدام تلميحات في محاولة للتأثير على مسارات الوصول، والانضمام النظام، أو الانضمام إلى الأسلوب.

على تحديث : في رده على التعليق قادني إلى هذا عرض، والتي قد تكون مفيدة أو مثيرة للاهتمام على الأقل.

إذا كنت أقول أنه لا توجد مؤشرات، ثم هل هذا يعني أيضا أنه لا توجد المفاتيح الأساسية أو أجنبية محددة؟ تحليل من الواضح أن الجداول وجمع الإحصاءات مهمة ولكن إذا الفوقية مثل تحديد كيف من المفترض أن ينضم غير موجود الجداول، ثم أوراكل أن تختار جيدا مسار تنفيذ الفقراء.

في هذه الحالة باستخدام تلميح مثل / * + * نأمر / قد يكون الخيار الوحيد لجعل محسن موثوق اختيار مسار حسن التنفيذ. قد يكون من المفيد أيضا إضافة مفاتيح الخارجية والمفاتيح الأساسية ولكن تعريف عليها كما DISABLE والتحقق من صحة.

وأعتقد أن فائدة هذا التعليق يعتمد على مدى النفور من مؤشرات يذهب حتى YMMV.

أولا إنشاء وجهة نظر حول هذا الاستعلام ثم إنشاء جدول من وجهة النظر هذه. أيضا إنشاء فهرس على تاريخ، وجعل العمل والجدول الزمني لها في الوقت منتصف الليل عندما يكون النظام خاملا.

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

و with a as (select /*+ MATERIALIZE */ ItemType, ItemNum, DateStored, ItemDate from items where ItemType in (112,115,189,241)) SELECT c.ClaimNumber, a.ItemDate, c.DTN, b.FilePath FROM a, itempages b, keygroupdata c WHERE a.ItemNum = b.ItemNum AND b.ItemNum = c.ItemNum ORDER BY a.DateStored DESC

وإزالة ORDER BY

وإجراء الفرز، بعد سحب الصفوف الخلفية إلى التطبيق الخاص بك.

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