Får du forskellige forespørgselsplaner, når du inkluderer tippet? Min antagelse er, at du gør det ud fra din beskrivelse af problemet.
Når du udfører en forespørgsel i Oracle, materialiserer databasen generelt ikke hele resultatsættet på noget tidspunkt (det kan det naturligvis være nødvendigt, hvis du angiver en ORDER BY
klausul, der kræver, at alle data materialiseres, før sorteringen sker). Oracle begynder faktisk ikke at materialisere data, før klienten begynder at hente data. Den kører nok af forespørgslen til at generere hvor mange rækker klienten har bedt om at hente (hvilket det lyder som 10 i dit tilfælde), returnerer disse resultater til klienten og venter på, at klienten anmoder om flere data, før den fortsætter med at behandle forespørgsel.
Det lyder som når FIRST_ROWS
tip er inkluderet, ændres forespørgselsplanen på en måde, der gør den dyrere at udføre. Det er naturligvis ikke målet med FIRST_ROWS
antydning. Målet er at fortælle optimeringsværktøjet at generere en plan, der gør hentning af de første N rækker mere effektiv, selvom det gør hentning af alle rækker fra forespørgslen mindre effektiv. Det har en tendens til at få optimeringsværktøjet til at favorisere ting som indeksscanninger frem for tabelscanninger, hvor en tabelscanning generelt kan være mere effektiv. Det lyder dog som om, i dit tilfælde, at optimizerens estimater er forkerte, og det ender med at vælge en plan, der bare generelt er mindre effektiv. Det betyder ofte, at nogle af statistikken på nogle af de objekter, din forespørgsel refererer til, er ufuldstændige eller forkerte.