sql >> Databasteknik >  >> RDS >> Oracle

Skillnad mellan WITH-sats och underfråga?

WITH sats är för subquery factoring, även känd som vanliga tabelluttryck eller CTE:

Klausulen WITH query_name låter dig tilldela ett namn till ett underfrågeblock. Du kan sedan referera till subquery-blocket på flera platser i frågan genom att ange query_name. Oracle Database optimerar frågan genom att behandla frågenamnet som antingen en inline-vy eller som en tillfällig tabell.

I ditt andra exempel, vad du har kallat temp_table är en inline-vy, inte en tillfällig tabell.

I många fall beror valet av vilken du vill använda på din föredragna stil, och CTE:er kan göra koden mer läsbar, särskilt med flera nivåer av underfrågor (åsikterna varierar naturligtvis). Om du bara hänvisar till CTE/inline-vyn en gång kommer du förmodligen inte att se någon skillnad i prestanda, och optimeraren kan sluta med samma plan.

De är dock särskilt användbara när du behöver använda samma underfråga på mer än en plats, till exempel i en fackförening. Du kan dra ut en inline-vy till en CTE så att koden inte upprepas, och den låter optimeraren materialisera den om den tror att det skulle vara fördelaktigt.

Till exempel detta konstgjorda exempel:

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

kan omfaktoreras till:

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

Underfrågan behöver inte längre upprepas. Ju mer komplicerad den upprepade koden är, desto mer fördelaktigt är det ur underhållssynpunkt att använda en CTE. Och ju dyrare underfrågan är, desto mer prestandafördelar kan du ha se från att använda en CTE, även om optimeraren vanligtvis är ganska bra på att ta reda på vad du gör ändå.



  1. Ansluter Linux och UNIX till Azure SQL Data Warehouse

  2. Finns det något sätt att visa en WHERE-sats bara för ett fält i MySQL?

  3. Varför postgres inte använder indexet i min fråga

  4. Oracle Ta bort rader som matchar flera värden