sql >> Databáze >  >> RDS >> Oracle

Oracle:využijte použití dvou indexů

Říkáte, že CAMPO47 je vysoce selektivní. Ale vy pouze filtrujete na IS NOT NULL. Nezáleží tedy na tom, kolik různých hodnot má, optimalizátor je nepoužije jako vstupní bod.

A jak moc je to selektivní? Jak můžete vidět z mohutností v plánu vysvětlení, výběr na STATO='SC' najde 12856 řádků ve vaší tabulce. 12702 z těchto řádků zjevných má CAMPO47 s hodnotou, takže testem nulity je odfiltrováno pouze 154 řádků. Kolik řádků by se vrátilo, pokud by optimalizátor nabral index na CAMPO47? Pravděpodobně mnohem více.

Optimalizátor může pro přístup k řádkům v tabulce použít pouze jeden index haldy. (Mechanismus je odlišný pro bitmapové indexy, když aplikují hvězdicovou transformaci). Pokud si tedy myslíte, že další přístupy k tabulce jsou nesnesitelnou zátěží, máte jednu možnost:složený index. Pokud je STATO skutečně neselektivní (relativně málo řádků), pak pravděpodobně můžete nahradit stávající index jedním na (STATO, CAMPO47).

Existuje starý trik, jak pošťouchnout databázi k použití indexu pro přístup k operacím IS NOT NULL, a to použití operandu, který může být pravdivý pouze tam, kde sloupec obsahuje hodnotu. Například něco takového pro sloupce řetězců (předpokládám, že něco s názvem CAMPO47 prostě musí být řetězec):

AND campo47 >= chr(0)

To bude odpovídat libovolnému sloupci, který obsahuje jeden nebo více znaků ASCII. Nejste si jisti, zda to povede k optimalizaci „dvou indexů“, kterou popisujete, ale za pokus to stojí. (Sám bych to otestoval, ale momentálně nemám přístup k databázi Oracle a SQL Fiddle mrštil, když jsem se pokusil podívat na plán vysvětlení)




  1. Najít všechny spoluautory – mapovací tabulka Faceting/Grouping for many to many

  2. Formátování částečných neznámých dat pomocí DateTime() z databáze?

  3. Aktualizujte tabulku v MySQL pomocí python dict

  4. Co je nového v MariaDB MaxScale 2.4