sql >> Database >  >> RDS >> Oracle

Oracle 10g - optimaliseren WHERE IS NOT NULL

De optimizer denkt dat de volledige tabelscan beter zal zijn.

Als er maar een paar NULL . zijn rijen, de optimizer heeft gelijk.

Als u er absoluut zeker van bent dat de toegang tot de index sneller zal zijn (dat wil zeggen, u heeft meer dan 75% rijen met col1 IS NULL ), hint dan op uw vraag:

SELECT  /*+ INDEX (t index_name_on_col1) */
        *
FROM    mytable t
WHERE   col1 IS NOT NULL

Waarom 75% ?

Omdat het gebruik van INDEX SCAN om waarden op te halen die niet door de index worden gedekt, impliceert een verborgen join op ROWID , die ongeveer 4 kost keer zoveel als tafelscannen.

Als het indexbereik meer dan 25% omvat van rijen is de tabelscan meestal sneller.

Zoals vermeld door Tony Andrews , clusterfactor is een nauwkeurigere methode om deze waarde te meten, maar 25% is nog steeds een goede vuistregel.



  1. het geven van de juiste gebruikersnaam en wachtwoord, verkrijg ORA-01017:ongeldige gebruikersnaam/wachtwoord; Aanmelding geweigerd

  2. Krijg meerdere waarden in de SQL Server-cursor

  3. Hoe u de juiste gegevenstypen selecteert

  4. Automatisch verhogen in orakel naar reeds gemaakte tabel