gpt4 book ai didi

oracle - 匿名 block 是否存储在 SGA 中?

转载 作者:行者123 更新时间:2023-12-02 09:00:04 25 4
gpt4 key购买 nike

我最近发现可以像这样从 jdbc 调用匿名 block :

    String plsql = "BEGIN" +                   " :result := foobar( booleanparameter => :mypar > 2);" +                   "END;";    con.prepareCall(plsql);

这很棒,因为我可以用它来“包装”一些函数调用并且克服一些 jdbc 限制。例如,我无法将 bool 变量传递给pl/sql 过程,并且无法更改过程签名,因为有很多依赖于它们的代码。添加新的“包装”程序也并不容易由于内部政策原因。

所以这似乎是一个可以接受的解决方案,但是,我担心解析高架。像这样的匿名 block 是在 SGA 中存储解析的还是每次调用时都会解析?

谢谢

更新 1: 我制作了一个快速 beanshell 脚本来按照 egorius 的建议查看 v$sqlarea:

String  plsql = "BEGIN :myresult := dbms_random.random ; END;";OracleDriver oracledrv = new OracleDriver();Connection   con = oracledrv.connect(connstr, new Properties());for (int i = 0 ; i < 1000 ; i++ ) {    CallableStatement cb = con.prepareCall(plsql);    cb.registerOutParameter("myresult", Types.INTEGER);    cb.execute();    System.out.println("random ->" +cb.getInt("myresult"));    cb.close();}con.close();

这就是我得到的 int v$sqlarea (我已经运行了两次):

SQL_TEXT--------------------------------------------------------------------------------PARSE_CALLS EXECUTIONS----------- ----------BEGIN :myresult := dbms_random.random ; END;       2000       2000

这是否意味着已经准备好?

最佳答案

匿名 block 也会被缓存。可以通过查询V$SQLAREA来查看.

SQL> declare abcabc number; begin null; end;
2 /

PL/SQL procedure successfully completed.

SQL> /

PL/SQL procedure successfully completed.

SQL> select sql_text, executions from v$sqlarea where sql_text like '%abcabc%';

SQL_TEXT
--------------------------------------------------------------------------------
EXECUTIONS
----------
declare abcabc number; begin null; end;
2

select sql_text, executions from v$sqlarea where sql_text like '%abcabc%'
1

编辑:

您将永远拥有所谓的“软解析”。它是查询的语法和语义检查所必需的。之后,如果库缓存中存在完全相同的查询,则将跳过 HARD PARSE。 (请参阅此 Ask Tom question 以获得很好的解释)。

以下是 tkprofed 10046 跟踪文件的摘录:

declare abcabc number; begin null; end;

call count cpu elapsed disk query current rows
------- ------ -------- ---------- ---------- ---------- ---------- ----------
Parse 2 0.00 0.00 0 0 0 0
Execute 2 0.00 0.00 0 0 0 2
Fetch 0 0.00 0.00 0 0 0 0
------- ------ -------- ---------- ---------- ---------- ---------- ----------
total 4 0.00 0.00 0 0 0 2

Misses in library cache during parse: 1

最后一行显示了要点。

关于oracle - 匿名 block 是否存储在 SGA 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1951388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com