在Postgres中,是一个创建临时表的WITH
子句,如果是这样,它可以安全地在多个线程中使用吗?
即。如果CTE在多个不同的线程中运行,那么下面的x是否正常?
WITH x AS (
SELECT psp_id
FROM global.prospect
WHERE status IN ('new', 'reset')
ORDER BY request_ts
LIMIT 1
)
UPDATE global.prospect psp
SET status = status || '*'
FROM x
WHERE psp.psp_id = x.psp_id
RETURNING psp.*;
答案 0 :(得分:0)
没有
使用CTE的查询创建一个表的内部临时表示,该表对查询本身是唯一可见的。
我也没有办法在多个线程中使用TEMPORARY
表,因为临时表只在同一个会话中可见。
下一个最好的事情是UNLOGGED
table。比普通餐桌还便宜,但不如上述任何一种便宜。
与CTE不同,您可以创建索引和ANALYZE
TEMPORARY
或UNLOGGED
表格 - 这可能会帮助很多具有巨大的基数但不是用你的例子(LIMIT 1
)。