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

Forskellen mellem WITH-klausul og underforespørgsel?

WITH klausul er til underforespørgselsfaktorering, også kendt som almindelige tabeludtryk eller CTE'er:

WITH query_name-sætningen lader dig tildele et navn til en underforespørgselsblok. Du kan derefter henvise til underforespørgselsblokken flere steder i forespørgslen ved at angive forespørgselsnavn. Oracle Database optimerer forespørgslen ved at behandle forespørgselsnavnet som enten en indlejret visning eller som en midlertidig tabel.

I dit andet eksempel, hvad du har kaldt temp_table er en inline-visning, ikke en midlertidig tabel.

I mange tilfælde afhænger valget af, hvad du vil bruge, til din foretrukne stil, og CTE'er kan gøre koden mere læsbar, især med flere niveauer af underforespørgsler (meningerne varierer selvfølgelig). Hvis du kun henviser til CTE/inline-visningen én gang, vil du sandsynligvis ikke se nogen forskel i ydeevne, og optimeringsværktøjet kan ende med den samme plan.

De er dog særligt nyttige, når du skal bruge den samme underforespørgsel mere end ét sted, f.eks. i en fagforening. Du kan trække en inline-visning ud i en CTE, så koden ikke gentages, og det giver optimeringsværktøjet mulighed for at materialisere det, hvis det mener, det ville være en fordel.

For eksempel dette konstruerede eksempel:

select curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0

kunne refaktoriseres til:

with temp_table as (
  select curr from tableone t1
  left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0

Underforespørgslen skal ikke længere gentages. Jo mere kompliceret den gentagne kode er, jo mere fordelagtigt er det fra et vedligeholdelsessynspunkt at bruge en CTE. Og jo dyrere underforespørgslen er, desto større ydeevne kunne du se ved at bruge en CTE, selvom optimeringsværktøjet normalt er ret god til at finde ud af, hvad du gør alligevel.



  1. Django Migrations:A Primer

  2. Postgresql GROUP_CONCAT tilsvarende?

  3. Bedste måde at få resultattælling, før LIMIT blev anvendt

  4. Kan databaseposter tilføjet fra elementer slettes med knappen?