Ik ben bezig met het optimaliseren van een rapportageproces, en loop er tegenaan dat één van de Oracle-queries waanzinnig slecht presteert. Hoop dat één van jullie mij in de juiste richting kan duwen. 
Alle tabellen in de query zijn gepartitioneerd op het veld MODEL_ID. Dit is tevens de primary key van de MODEL tabel.
Deze query presteert prima:
Helaas heeft de applicatie die de query aanroept niet de beschikking over het juiste MODEL_ID (noch kunnen we dit aanpassen), alleen de juiste waarde voor het NAME veld in de MODEL tabel (deze is overigens uniek, maar niet afgedwongen in het schema).
Echter zodra ik de MODEL_ID expliciet uit de where-clause laat, vindt Oracle het nodig om een full-table scan te doen op de onderliggende tabellen (hetgeen een factor 10 langer duurt):
Vanuit mijn semi-leken-begrip had ik gehoopt dat het expliciet maken van de relatie met MODEL_ID middels een subquery tot verbetering zou leiden, maar helaas
Wat kan ik eraan doen om in het bovenstaande scenario de full-table scan te vermijden?
Dank
Alle tabellen in de query zijn gepartitioneerd op het veld MODEL_ID. Dit is tevens de primary key van de MODEL tabel.
Deze query presteert prima:
SQL:
1
2
| SELECT SQ.* FROM (...) SQ INNER JOIN MODEL M ON SQ.MODEL_ID = M.MODEL_ID WHERE M.MODEL_ID = 1000 |
Helaas heeft de applicatie die de query aanroept niet de beschikking over het juiste MODEL_ID (noch kunnen we dit aanpassen), alleen de juiste waarde voor het NAME veld in de MODEL tabel (deze is overigens uniek, maar niet afgedwongen in het schema).
Echter zodra ik de MODEL_ID expliciet uit de where-clause laat, vindt Oracle het nodig om een full-table scan te doen op de onderliggende tabellen (hetgeen een factor 10 langer duurt):
SQL:
1
2
| SELECT SQ.* FROM (...) SQ INNER JOIN MODEL M ON SQ.MODEL_ID = M.MODEL_ID WHERE M.NAME = 'Voorbeeld' |
Vanuit mijn semi-leken-begrip had ik gehoopt dat het expliciet maken van de relatie met MODEL_ID middels een subquery tot verbetering zou leiden, maar helaas
SQL:
1
2
| SELECT SQ.* FROM (...) SQ INNER JOIN MODEL M ON SQ.MODEL_ID = M.MODEL_ID WHERE M.MODEL_ID = (SELECT MODEL_ID FROM MODEL WHERE NAME = 'Voorbeeld') |
Wat kan ik eraan doen om in het bovenstaande scenario de full-table scan te vermijden?
Dank
[ Voor 3% gewijzigd door Knakker op 11-06-2014 13:59 ]
Geef mij maar een Warsteiner.