Database PostgreSQL中使用游标的更新性能

Database PostgreSQL中使用游标的更新性能,database,postgresql,database-performance,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; 是否有人对此进行过测试,或者知道如何使用游标进行更新,以便对此进行评论 编辑:我现在已经对此进行了基准测试,发现事实上,做最新的例子要快三分之一左右。我将每个查询运行1

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

UPDATE films SET kind = 'Dramatic' WHERE CURRENT OF c_films;
或者像这样:

UPDATE films SET kind = 'Dramatic' WHERE unique_indexed_int_column = 3000;
是否有人对此进行过测试,或者知道如何使用游标进行更新,以便对此进行评论


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

我不熟悉PostgreSQL,所以我只能给你一个一般性的答案

首先,如果
indexed\u int\u column
不是唯一的,则第二条语句将更新多行,而第一条语句将只更新光标
c\u films
下的当前行。因此,这些陈述并不完全相同


假设唯一性和光标c_films位于
index_int_column=3000
的一行,那么一旦光标位于某一行下,更新应该非常快,因为光标持有信息以直接访问该行的物理位置。但是,第二条语句必须首先获取索引,查找其中的值3000,然后才知道要更新的行的物理位置。这就是说,必须在某个点对游标执行此查找操作(如果我们没有迭代整个表)。因此,一般来说,当您必须首先读取数据,然后要更新刚刚读取的同一行时,使用光标才有回报。

请在上查看这两行之间令人惊讶的基准:这一点都不奇怪,但可能我没有很好地阐述我的答案。“按光标更新”的唯一情况是当您想读取第一次更新的日期时。在任何其他场景中,显然读取和更新的速度最多与直接更新的速度相同,通常较慢(特别是因为数据库和程序之间存在额外的通信往返)。(如果不是这样,DB将很愚蠢,在这种情况下不总是在事后读写以获得性能…)