重用游标与创建新游标的权衡是什么?

17 投票
1 回答
4501 浏览
提问于 2025-04-15 17:50

在cx_Oracle(或者说Oracle数据库)中,是否可以为每个查询分配一个游标,或者在多个查询之间重复使用一个游标呢?

def getSomeData(curs):         # case 1: pass in a cursor, which is generally
    curs.execute('select ...') #         reused across queries
    return curs.fetchall()

def getSomeData(conn):         # case 2: pass in a connection,allocate
    curs=conn.cursor()         #         a cursor for this query
    curs.execute('select ...')
    return curs.fetchall()

当然,这两种方法返回的数据是一样的。

这两种方法各有什么优缺点呢?哪种方法效率更高或者更低吗?在多个查询中重复使用一个游标有没有什么潜在的问题呢?

1 个回答

11

你可以随意重复使用一个 cx_Oracle 的游标,这没问题。如果你在短时间内执行成千上万条小查询,重复使用游标可能会稍微提高性能,但我对此持怀疑态度。

有时候我会创建新的游标,有时候则会重复使用已有的游标,这主要取决于哪个方式让代码更容易阅读和理解。

比如说,如果我有很多不同的程序需要访问数据库,我可能会把一个 Oracle 连接对象或者在这个连接上创建的游标传来传去。

总之,选择让你的代码更易读、更易维护的方式才是最重要的。

撰写回答