2011-01-21 46 views
0

使用游标更新我想知道在使用下面的方法更新表的性能差异:性能上的PostgreSQL

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

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

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

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

+0

请参阅这两个之间令人惊讶的基准:http://stackoverflow.com/questions/4776127/postgres-surprising-performance-on-updates-using-cursor – David 2011-01-23 20:44:34