我想知道使用以下方法更新表时的性能差异:
UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
或者像这样:
UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000;
是否有人对此进行了测试或了解如何使用游标进行更新,以便他们对此进行评论?
编辑:我现在已对此进行了基准测试,发现最新的示例实际上快了大约三分之一。我运行了每个查询100000次并计算了差异。我使用psycopg2使用服务器端游标与Postgres进行通信。我将进一步调查,看看我是否能够发现并非总是如此。
答案 0 :(得分:1)
我不熟悉PostgreSQL,所以我只能给你一个通用答案。
首先,如果indexed_int_column
不唯一,则第二个语句将更新多个行,而第一个语句将仅更新当前光标c_films
下的行。所以这些陈述并不完全相同。
假设唯一性和光标c_films位于indexed_int_column = 3000
的一行,那么一旦光标位于某一行下,更新应该非常快,因为光标保存信息以直接访问物理位置这一行。然而,第二个语句必须首先获取索引,在其中查找值3000,然后才知道要更新的行的物理位置。也就是说,这个查找操作必须在一个点上完成游标(如果我们没有迭代整个表)。所以一般情况下,当你必须首先读取数据然后想要更新你刚读过的同一行时,只需使用光标就可以获得回报。