0

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

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

或像这样:

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

有没有人测试过这个或者知道使用游标的更新是如何工作的,所以他们可以对此发表评论?

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

4

1 回答 1

1

我对PostgreSQL不熟悉,所以只能给你一个笼统的答案。

首先,如果indexed_int_column不是唯一的,第二个语句将更新多行,而第一个语句只会更新当前光标下的行c_films。因此,陈述并不相同。

假设唯一性和游标 c_films 位于其中的一行indexed_int_column = 3000,那么一旦游标位于某一行下方,更新应该非常快,因为游标包含直接访问该行物理位置的信息。然而,第二条语句必须首先获取索引,在其中查找值 3000,然后它才会知道要更新的行的物理位置。也就是说,这个查找操作必须在某个点对游标进行(如果我们没有遍历整个表)。所以一般来说,只有在你必须先读取数据,然后想要更新刚刚读取的同一行时,才使用游标。

于 2011-01-21T22:04:24.387 回答