在PostgreSQL中使用游标进行更新时的性能

时间:2011-01-21 21:56:53

标签: database postgresql database-performance

我想知道使用以下方法更新表时的性能差异:

UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;

或者像这样:

UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000;

是否有人对此进行了测试或了解如何使用游标进行更新,以便他们对此进行评论?

编辑:我现在已对此进行了基准测试,发现最新的示例实际上快了大约三分之一。我运行了每个查询100000次并计算了差异。我使用psycopg2使用服务器端游标与Postgres进行通信。我将进一步调查,看看我是否能够发现并非总是如此。

1 个答案:

答案 0 :(得分:1)

我不熟悉PostgreSQL,所以我只能给你一个通用答案。

首先,如果indexed_int_column不唯一,则第二个语句将更新多个行,而第一个语句将仅更新当前光标c_films下的行。所以这些陈述并不完全相同。

假设唯一性和光标c_films位于indexed_int_column = 3000的一行,那么一旦光标位于某一行下,更新应该非常快,因为光标保存信息以直接访问物理位置这一行。然而,第二个语句必须首先获取索引,在其中查找值3000,然后才知道要更新的行的物理位置。也就是说,这个查找操作必须在一个点上完成游标(如果我们没有迭代整个表)。所以一般情况下,当你必须首先读取数据然后想要更新你刚读过的同一行时,只需使用光标就可以获得回报。