sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvorfor kommer planlæggeren med forskellige resultater for funktioner med forskellig volatilitet?

Den anslår 1000 rækker

1000 estimerede rækker er en standardværdi dokumenteret i OPRET FUNKTION :

Når en funktion erklæres flygtig, beder den om ikke at blive inlinet, så denne standardværdi for result_rows holder.

På den anden side, når det bliver inlinet i en forespørgsel som i din anden test, vil antallet af rækker blive estimeret, som om funktionens krop var blevet flyttet ind i forespørgslen, og funktionserklæringen ikke eksisterede. Dette fører i den anden test til et nøjagtigt estimat siden VALUES klausul kan evalueres direkte.

Hvad er det præcis, planlæggeren laver her, og hvor kan jeg læse noget dokumentation om det?

Generelt er planlæggerens optimeringsstrategier ikke forklaret i hoveddokumentationen. De bliver diskuteret i mailinglister og nævnt i kildekodekommentarerne, som heldigvis har en tendens til at være usædvanligt klare og velskrevne (sammenlignet med gennemsnitlig kildekode). I tilfælde af funktionsinlining tror jeg på kommentarerne fra inline_set_returning_functions og inline_set_returning_function afsløre de fleste regler, der driver denne særlige optimering. (advarsel:ovenstående links er i den aktuelle mastergren, som kan ændres eller afvikles når som helst).




  1. Udfyldning af en rullemenu med databaseresultater i Laravel 4

  2. MYSQL OPDATERING SÆT på samme kolonne, men med flere WHERE-klausuler

  3. mySQL lagret funktion til at skabe en slug

  4. cx_Oracle og undtagelseshåndtering - god praksis?