我已经读到 PostgreSQL 通常可以使用多个索引,但是在跨两个索引的查询的特定情况下,它会同时使用两个索引吗?如果是这样,它们是按顺序加载还是一起加载?
例如,如果此查询跨越两个部分索引 by column_1
,将如何使用部分索引,以及如何加载和丢弃索引数据:
SELECT 1 FROM sample_table WHERE column_1 > 50 AND column_2 < 50000
Run Code Online (Sandbox Code Playgroud) 出于性能原因,我正在编写一个大型的多步 CTE 。
在一个查询中,数据必须从一个表移动到另一个表,但移动的行数是不确定的,可能为零。
在后续表中,删除来自前一个查询的源,但必须在完成前一个查询之后。
最后,在上面的第二个查询完成后,必须写入行来代替已删除的行。
在前两个查询中,我使用 RETURNING 来强制执行顺序。
在第二个查询中,我确定第一个查询是由这个子查询完成的
(SELECT COUNT(*) FROM first_query) >= 0
Run Code Online (Sandbox Code Playgroud)
在第三个查询中,我确定第二个查询是由这个子查询完成的
SELECT EXISTS (SELECT 1 FROM second_query)
Run Code Online (Sandbox Code Playgroud)
确定第一个查询已完成的子查询是否正确?
用于确定必须返回行的第二个查询已完成最佳准确性、精度和性能的子查询?
使用上述子查询来强制执行顺序会导致重复的键值违规。
查询小节
WITH copy_to_other_table AS (
INSERT INTO other_table (column_a, column_b)
SELECT column_a, column_b
FROM main_table
WHERE column_a = $1::bigint
RETURNING *
),
main_table_deleted AS (
DELETE FROM main_table WHERE column_a = $1::bigint
AND (SELECT COUNT(*) FROM copy_to_other_table) >= 0
RETURNING *
)
INSERT INTO main_table (column_a, column_b)
SELECT column_a, column_b
FROM another_table …
Run Code Online (Sandbox Code Playgroud) 在PostgreSQL Concurrency With MVCC 页面上,它说:
知道你在想什么:同时更新同一行的两个事务怎么样?这就是事务隔离级别的用武之地。Postgres 基本上支持两种模型,允许您控制如何处理这种情况。默认值 READ COMMITTED 在初始事务完成后读取行,然后执行语句。如果行在等待时发生更改,它基本上会重新开始。例如,如果您使用 WHERE 子句发出 UPDATE,则 WHERE 子句将在初始事务提交后重新运行,如果仍然满足 WHERE 子句,则执行 UPDATE。
该文件似乎表明,提交读仍然受到故障,应予以重审。
可以将 READ COMMITTED 设置为以与 SERIAZLIZABLE 相同的原子性无限期重试吗?
postgresql performance version-control serialization postgresql-performance