js css html

[PostgreSQL] - CTE

2022-07-31  本文已影响0人  夹胡碰

一、什么是CTE

全称 common table expressions,表示临时结果,用with as语句,可以在其他SQL中引用,如select、insert、update和delete。

二、有什么作用

相当于用with as语句创建临时表,SQL结构清晰,并且结果可以复用。

三、如何使用

下面是使用样例

with c1 as (
    select * from t1
) 
,with c2 as (
    select * from c1
) 

select * from c2 where id = 100;

四、是否进行物化

as materialized or not as materialized
在PG12之前,with语句都是通过将子查询先进行物化,这就导致了一个问题:with子查询外的条件无法内推到里面,并且会产生物化视图,会影响查询性能
使用PG12会自动判断是否物化(自测得出,版本12.2),但是有些场景需要我们手动控制才能保证查询效率。

1、with as

只有其中一个with as物化了

2、with as not materialized

没有物化的


3、with as materialized

全部物化


五、建议

1、物化场景

a. 复杂计算结果表,或多表复用可以物化。

2、非物化场景

a. join表不要物化,内存中直接连接(尽量on在索引上)。
b. 能进行索引内推的不要物化,或者在内部就进行where筛选。
参考

1、PostgreSQL CTE语句与materialized
2、7.8. WITH查询(公共表表达式)

上一篇 下一篇

猜你喜欢

热点阅读