سؤال

لدي هذا الجدول:

create table demo (
    key number(10) not null,
    type varchar2(3) not null,
    state varchar2(16) not null,
    ... lots more columns ...
)

وهذا الفهرس:

create index demo_x04 on demo(key, type, state);

عندما أقوم بتشغيل هذا الاستعلام

select * from demo where key = 1 and type = '003' and state = 'NEW'

EXPLAIN PLAN يدل على أنه يقوم بمسح طاولة كاملة. لذلك أنا أسقطت الفهرس وإنشائها مرة أخرى. EXPLAIN PLAN لا يزال يقول مسح الجدول الكامل. كيف يمكن أن يكون؟

بعض الخلفية: هذه بيانات تاريخية، إذن ما يحدث هو أنني أبحث عن صف مع الدولة CLEARED وإدراج صف جديد مع الدولة NEW (بالإضافة إلى نسخ بعض القيم من الصف القديم). ثم يتم بعد ذلك تحديث الصف القديم USED. وبعد لذلك ينمو الجدول دائما. ما ذكرته هو أن بطاقة الفهرسة هي 0 (على الرغم من حقيقة أن لدي الآلاف من القيم المختلفة). بعد إعادة إنشاء، نمت الكرادة ولكن CBO لم يعجبك الفهرس أفضل.

في صباح اليوم التالي، أحب Oracle فجأة الفهرس (ربما ينام فوقه) وبدأ استخدامه ولكن ليس لفترة طويلة. بعد فترة من الوقت، انخفضت المعالجة من 50 صفا / ثانية إلى 3 صفوف / ثانية ورأيتها مرة أخرى "مسح الجدول الكامل". ما الذي يجري؟

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

أنا على أوراكل 10G.

تحرير] لدي 969'491 مفاتيح مميزة في هذا الجدول، 3 أنواع و 3 دول.

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

المحلول

ماذا يحدث إذا حددت تلميح فهرس؟ جرب هذا:

SELECT /*+ INDEX (demo demo_x04) */ * 
  FROM demo 
 WHERE key = 1 
   AND type = '003' 
   AND state = 'NEW';

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

أضف تلميحا ومعرفة ما إذا كان شرح الخطة يمنحك خطة مختلفة والنداء الاستعلام أفضل.

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

لتحديث الإحصاءات للجدول، استخدم dmbs_stats.gather_table_stats. صفقة.

علي سبيل المثال:

Exec DBMS_STATS.GATER_TABLE_STATS ("المالك"، "DEMO")؛

نصائح أخرى

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

جرب هذا:

select last_analyzed, num_rows 
from user_tables
where table_name = 'DEMO';

يخبرك Num_Rows كم عدد الصفوف التي تعتقد Oracle أن الجدول يحتوي على.

"في صباح اليوم التالي، أحب Oracle فجأة الفهرس (ربما ينام فوقه)" ربما يكون DBMS_STATS قيد التشغيل بين عشية وضحاها.

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

والثاني هو عندما يكون الاستعلام بحيث لا يمكن استخدام فهرس عمليا.

"select * from demo where key = 1 and type = '003' and state = 'NEW'"

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

السبب الثالث هو المكان الذي يعتقد فيه الاستعلام معالجة نسبة كبيرة من الصفوف في الجدول. النوع والولاية تبدو بطادة منخفضة جدا. هل ربما لديك عدد كبير من قيمة "المفتاح" المحدد؟

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

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

select key, type, state from demo where key = 1 and type = '003' and state = 'NEW'

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

أنا فقط أظن بناء على بيانك أن المؤشر يظهر كاردينية 0.

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