我正在开发一个具有大量游标的应用程序,其中许多只是在包头中定义而未在包体中使用,所以这个未使用的游标是否会产生开销?
答案 0 :(得分:1)
声明的游标但未使用的游标不会产生任何开销,但可能会打开但未使用的游标。
打开的游标存储在PGA的私有SQL区域中。此“包含有关已解析的SQL语句和其他特定于会话的信息以供处理的信息。”。您可以通过查询V$PGASTAT
找到您拥有的PGA数量。
来自Oracle的Memory Architecture documentation并不是100%清楚,是否已打开但未使用的游标存储在PGA中的任何内容。关于PGA的私有SQL区域的持久区域的部分将暗示只有在将任何变量绑定到游标时才会创建此区域。但是,由于必须存储光标的状态,以便DB知道它是打开的,我假设使用某些内存。
如果单个打开的光标对您的表现产生负面影响,我会感到震惊。这表明你已经大量低估了你需要的PGA和SGA(执行计划存储在这里)的大小。
但是,由于 open_cursors 参数限制了开放游标的数量,因此该策略可能会大量适得其反,您可以在V$PARAMETER
中找到该参数。这是您可以打开的打开游标数量的绝对上限。如果达到此限制,您将获得ORA-01000。
这意味着您不应该打开不会使用的游标。
然而,值得注意的是this particular Ask Tom question/answer,尽管它是从2004年开始的。
3-如果open_cursors增加,那么对db>的性能影响将是什么?服务器和内存使用情况?
......2004年4月1日 - 上午10点UTC:
...
... 3)如果你没有击中ora-1000,它将不会改变任何东西(因为你没有使用你现有的游标)