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

Hvad er præstationsimplikationerne af Oracle IN-klausul uden joinforbindelser?

Hvis statistikken på din tabel er nøjagtig, burde det være meget usandsynligt, at optimeringsværktøjet ville vælge at lave en tabelscanning i stedet for at bruge det primære nøgleindeks, når du kun har 1000 hårdkodede elementer i WHERE klausul. Den bedste tilgang ville være at indsamle (eller indstille) nøjagtige statistikker om dine objekter, da det burde få gode ting til at ske automatisk i stedet for at prøve at lave en masse gymnastik for at omgå forkerte statistikker.

Hvis vi antager, at statistikken er unøjagtig i en sådan grad, at optimeringsværktøjet ville blive ført til at tro, at en tabelscanning ville være mere effektiv end at bruge det primære nøgleindeks, kan du potentielt tilføje en DYNAMIC_SAMPLING tip, der ville tvinge optimeringsværktøjet til at indsamle mere nøjagtige statistikker, før erklæringen eller en CARDINALITY optimeres tip til at tilsidesætte optimeringsværktøjets standardkardinalitetsestimat. Ingen af ​​disse ville kræve at vide noget om de tilgængelige indekser, det ville bare kræve at kende tabelaliaset (eller navnet, hvis der ikke er noget alias). DYNAMIC_SAMPLING ville være den sikrere, mere robuste tilgang, men det ville tilføje tid til parsing-trinnet.

Hvis du opbygger en SQL-sætning med et variabelt antal hårdkodede parametre i en IN klausul, vil du sandsynligvis skabe ydeevneproblemer for dig selv ved at oversvømme din delte pulje med SQL, der ikke kan deles, og tvinge databasen til at bruge meget tid på at analysere hver variant separat. Det ville være meget mere effektivt, hvis du oprettede en enkelt delbar SQL-sætning, der kunne parses én gang. Afhængigt af hvor din IN klausulværdier kommer fra, der kan ligne

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM global_temporary_table);

eller

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM TABLE( nested_table ));

eller

SELECT *
  FROM table_name
 WHERE primary_key IN (SELECT primary_key
                         FROM some_other_source);

Hvis du fik dig selv ned til en enkelt delbar SQL-sætning, så ville du ud over at undgå omkostningerne ved konstant at analysere sætningen igen have en række muligheder for at tvinge en bestemt plan, som ikke involverer ændring af SQL-sætningen. Forskellige versioner af Oracle har forskellige muligheder for planstabilitet - der er lagrede konturer , SQL-planstyring , og SQL-profiler blandt andre teknologier afhængigt af din udgivelse. Du kan bruge disse til at fremtvinge bestemte planer for bestemte SQL-sætninger. Hvis du bliver ved med at generere nye SQL-sætninger, der skal parses igen, bliver det dog meget vanskeligt at bruge disse teknologier.




  1. IF else tilstand i sql lagret procedure

  2. Udefineret egenskab:Illuminate\Database\Eloquent\Collection::Laravel 5.2

  3. Hvordan parses kommasepareret streng i PL/SQL?

  4. For normalform og for- og efternavne