2009-01-07 19 views
15

Sorgu performansını optimize etmeye çalışıyorum ve optimizer ipuçlarını kullanmaya başvurmak zorunda kaldım. Ancak, optimize edicinin aynı anda birden fazla ipucu kullanması durumunda hiç öğrenmedim.Oracle optimizer aynı SELECT'te birden fazla İpucu kullanır mı?

örn.

SELECT /*+ INDEX(i dcf_vol_prospect_ids_idx)*/ 
     /*+ LEADING(i vol) */ 
     /*+ ALL_ROWS */ 
     i.id_number, 
     ... 
    FROM i_table i 
    JOIN vol_table vol on vol.id_number = i.id_number 
    JOIN to_a_bunch_of_other_tables... 
WHERE i.solicitor_id = '123' 
    AND vol.solicitable_ind = 1; 

Açıklama planı aynı maliyeti gösterir, ancak bunun yalnızca bir tahmini olduğunu biliyorum.

Lütfen tüm tablo ve dizin istatistiklerinin hesaplandığını varsayalım. FYI, index dcf_vol_prospect_ids_idx i.solicitor_id sütununda.

sayesinde

cevap

19

harika Oracle belgelerine (http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/hintsref.htm) Bu örnekte gösterildiği gibi, tek bir açıklama bloğunda tüm ipuçlarını belirtmeyi deneyin

Yahni. Bazı durumlarda, optimum yürütme planını sağlamak amacıyla ipuçları tam bir set belirtmeniz gerekebilir, ipuçlarını kullanırken İpuçları

bir Tam Set belirtme

16.2.1. Örneğin, tablo birleştirmeler birçok oluşur çok karmaşık bir sorgu var eğer ve eğer bir verilen tablo için sadece INDEX ipucu belirtin sonra iyileştirici kullanılmak üzere geri kalan erişim yolları belirlemek için ihtiyacı yanı sıra, karşılık gelen birleştirme yöntemleri. Bu nedenle, INDEX ipucu, verdi rağmen iyileştirici olabilir iyileştirici istenen indeks tarafından seçilen nedeniyle katılmak yöntem ve erişim yolları kullanılamaz tespit ettik çünkü, ipucu mutlaka kullanımı iyileştirici.

Örnek 16-1'de, LEADING ipi , kullanılan tam birleştirme sırasının, kullanılacak olmasını; 'da kullanılacak birleştirme yöntemleri, farklı tablolar da belirtilen vardır.

Örnek 16-1 İpuçları

SELECT /*+ LEADING(e2 e1) USE_NL(e1) INDEX(e1 emp_emp_id_pk) 
      USE_MERGE(j) FULL(j) */ 
    e1.first_name, e1.last_name, j.job_id, sum(e2.salary) total_sal 
FROM employees e1, employees e2, job_history j 
WHERE e1.employee_id = e2.manager_id 
    AND e1.employee_id = j.employee_id 
    AND e1.hire_date = j.start_date 
GROUP BY e1.first_name, e1.last_name, j.job_id ORDER BY total_sal; 
+0

Eğer herhangi biri umursuyorsa, bunu denedim ve Açıklayıcı Plan daha önce olduğu gibi aynı maliyeti verdi. CBO'nun gerçekten kullanacağını kim bilebilir! : -/ –

+0

Dave, Bu bölümden belirli bir RTFMedim, ancak bu harika örnekle asla karşılaşmadım. Aptal yazı için özür dilerim; Bunu gerçekten yapmamaya çalışıyorum!: -/ sayesinde güveç –

2

Aslında bir Tam Set belirtme Jonathan Lewis, Maliyet Bazlı Oracle Temelleri Yazar öneri olduğunu CBO doğru bulma başarısız olursa Planda, CBO'nun işini üstlenmeniz ve "katmanı" - sorgudaki tablo başına ortalama iki ipucu almanız gerekir. Bunun nedeni, bir ipucunun CBO'nun yardımsız kalmasından daha kötü ve muhtemelen daha kötü bir plana yol açabilmesidir. CBO yanlışsa, sadece doğru yönde bir dürtme değil, tüm planı vermeniz gerekir.

+0

> CBO yanlışsa hayır, eğer oldukça büyük gibi görünüyor mı? :-) İlginç bir nokta olsa da. Tom Kyte'ı okuduğumdan, İpuçları kullanmadan önce mümkün olan her şeyi yapmanızı önerir. –

+1

TOTALLY katılıyorum. Fakat CBO yanlış olabilir. Kompleksin mükemmel olmayı ummadığı bir kod yok. Ben TK adananıyım ve haklı. Programcıların ve DBA'ların% 90'ının CBO'nun aslında yanlış olduğunu ve sadece yalan söylendiğini bilmediğini belirtmemek gerekir. –

İlgili konular