假设我有以下程序
CREATE PROCEDURE foo (table1_id IN TABLE1.table1_id%type,
table1_val IN TABLE1.table1_value%type)
AS
SQL_UPDATE VARCHAR2(500) := 'UPDATE TABLE1 SET table1_value =:1 WHERE table1_id = :2';
BEGIN
--.....
--1 :
EXECUTE IMMEDIATE SQL_UPDATE USING foo.table1_val, foo.table1_id;
--2 :
UPDATE TABLE1 SET table1_value = foo.table1_val WHERE table1_id = foo.table1_id;
END;
除了样式/可读性之外,在这种情况下(我的意思是当它绝对可以避免时)与(2)相比,使用动态查询(1)是否有任何性能损失?
谢谢你。
我可能这样做的唯一原因是,如果我需要处理一个在编译时可能不存在的对象——例如,如果我有代码来根据需要创建新的外部表。
顾名思义,PL/SQL 编译时动态 SQL 语句没有被解析,所以你不知道它是否正确,并且依赖关系没有存储在数据库中。
对于简单的 SQL 语句,例如您所描述的语句,Oracle DB 的性能确实受到了整体影响。由于 DBMS 每次都必须对 sql 进行软解析(这也占用了一点时间),因此它需要写入SGA,并且最终可能会从静态查询的已解析执行计划中占用资源,因为SGA不是无穷。如果您在过程中以动态 SQL 运行大量语句,则性能会随着时间的推移而下降。请记住,捕捉由动态 SQL 引起的错误比标准 SQL 语句引发的错误要复杂得多。
如果您正在使用 db 对象进行复杂的管理工作,或者您的查询与过程的输入有很大差异,我建议只使用动态 SQL。即使在这些情况下,您最好使用 if / else 语句来指示您的查询。