sql >> Database teknologi >  >> RDS >> Oracle

Oracle:drag fordel af at bruge to indekser

Du siger, at CAMPO47 er meget selektiv. Men du filtrerer kun på IS NOT NULL. Så det er lige meget, hvor mange forskellige værdier det har, optimeringsværktøjet vil ikke bruge det som indgangspunkt.

Og hvor selektiv er det? Som du kan se af kardinaliteterne i forklaringsplanen, finder du 12856 rækker i din tabel ved at vælge på STATO='SC'. 12702 af disse rækker har åbenlyst CAMPO47 med en værdi, så kun 154 rækker er filtreret fra af testen for nullitet. Hvis optimeringsværktøjet var steget til indekset på CAMPO47, hvor mange rækker ville det have returneret? Sandsynligvis meget mere.

Optimeringsværktøjet kan kun bruge ét heap-indeks til at få adgang til rækker i en tabel. (Mekanismen er anderledes for bitmap-indekser, når de anvender en stjernetransformation). Så hvis du mener, at de ekstra tabeladgange er en uudholdelig byrde, har du én mulighed:et sammensat indeks. Hvis STATO virkelig er uselektiv (relativt få rækker), er du sandsynligvis sikker ved at erstatte det eksisterende indeks med et på (STATO, CAMPO47).

Der er et gammelt trick til at skubbe databasen til at bruge et indeks for at få adgang til IS NOT NULL-operationer, og det er at bruge en operand, som kun kan være sand, hvor kolonnen indeholder en værdi. For eksempel noget som dette for strengkolonner (jeg går ud fra, at noget kaldet CAMPO47 bare skal være en streng):

AND campo47 >= chr(0)

Det vil matche enhver kolonne, der indeholder et eller flere ascii-tegn. Ikke sikker på, om det vil føre til den "to-indeks"-optimering, du beskriver, men det er et forsøg værd. (Jeg ville selv teste dette, men jeg har ikke adgang til en Oracle-database lige nu, og SQL Fiddle smed, da jeg prøvede at se på Explain Plan)




  1. SYSTIMESTAMP Funktion i Oracle

  2. Brug af kolonnealias i samme SELECT-klausul

  3. Hvordan aktiverer man stort indeks i MariaDB 10?

  4. Udfør MySQL Stored Procedure ved hjælp af kommandolinjen