在我的数据库的多个地方,开发人员使用了动态sql而不是静态sql。他们说这是为了提高性能。有人可以告诉我动态sql是否真的可以提高存储过程或plsql块的性能吗?
哪个执行速度更快,为什么?
1。
begin
execute immediate 'delete from X';
end;
2。
begin
delete from X;
end;
您的示例代码非常简单,几乎没有什么区别,但是在那种情况下,静态版本最有可能执行得更好。
使用动态SQL来提高性能的主要原因是,当SQL语句发生重大变化时-
例如,您可以根据系统状态在运行时向WHERE子句添加额外的代码(受子查询限制)在地址上(如果输入了地址等)。
另一个原因是,有时将Bind变量用作参数可能适得其反。
例如,如果您有类似状态字段的内容,则数据分布不均匀(但已建立索引)。
当处理95%的数据时,请考虑以下3条语句
SELECT col FROM table
WHERE status = 'U'-- unprocessed
AND company = :company
SELECT col FROM table
WHERE status = 'P' -- processed
AND company = :company
SELECT col FROM table
WHERE status = :status
AND company = :company
在最终版本中,Oracle将选择通用的解释计划。在第一个版本中,它可能决定最好的计划是从状态索引开始(知道“ U”未处理的条目在总数中只占很小的一部分)。
您可以通过不同的静态语句来实现这一点,但是如果您有更复杂的语句(仅需更改几个字符),则动态SQL可能是一个更好的选择。
缺点
相同的动态SQL语句的每次重复都会产生一个软解析,与静态语句相比,这是一个很小的开销,但是仍然是一个开销。
每个NEW sql语句(动态或静态)也会在SGA(共享内存)上产生锁定,并可能导致推出“旧”语句。
一个糟糕但常见的系统设计是,有人使用动态SQL来生成仅随键而异的简单选择-即
SELECT col FROM table WHERE id = 5
SELECT col FROM table WHERE id = 20
SELECT col FROM table WHERE id = 7
各个语句将很快,但是整个系统的性能将下降,因为它会杀死共享资源。
另外-使用动态SQL在编译时捕获错误要困难得多。如果使用PL /
SQL,则会浪费大量的编译时间检查。即使使用JDBC之类的东西(将所有数据库代码都移到字符串中-很好!),您也可以使用预解析器来验证JDBC内容。动态SQL
=仅运行时测试。
开销
立即执行的开销很小-大约是千分之一秒-
但是,如果它在循环内/在每个对象调用一次的方法上等等,它可以加起来。通过替换动态对象,我曾经获得了10倍的速度提高具有生成的静态SQL的SQL。但是,这使代码复杂化,并且仅因为我们需要速度而完成了。
问题内容: 直到几周前,我还以为我知道何时创建字段和方法或。例如,当一个字段(例如另一个类的对象)对于该类的任意数量的对象是唯一的时,应将其设置为。 但是几周后,我读到了有关JVM垃圾收集的信息。 我知道字段永远不会被垃圾收集,并且始终保持在内存中,除非类加载器本身是垃圾收集的。 但是,如果我不创建该字段,至少它将被垃圾回收。 因此,在使字段/方法静态化与否之间似乎有一条 很细的界限 。 有人可以
静态绑定还是动态绑定? 这显示了什么样的多态性?
问题内容: 我目前正在为我的一个类进行分配,在其中,我必须使用Java语法给出 静态 和 动态绑定的 示例。 我了解基本概念,即静态绑定在编译时发生,而动态绑定在运行时发生,但是我无法弄清楚它们实际上是如何工作的。 我找到了一个在线静态绑定的示例,给出了以下示例: 并且这将显示“ animal is eating”,因为 对的调用使用了静态绑定,但是我不确定 为什么 将其视为静态绑定。 到目前为止
我不得不承认,随着iOS8的发布,我对iOS中的动态和静态框架有点困惑。 我正在寻找一种方法来分发我创建的库,我需要支持iOS7和更高版本。(注意:这将是一个专有的框架。我不能使用可可荚,我也不能分发源代码)。下面是我已经知道的: iOS 8为iOS引入了“嵌入式框架”,但据我所知,它们不适用于iOS 7,仅适用于iOS 8及以上版本。 我可以选择将我的库作为静态库(.a文件)分发,还可以分发头。
本文向大家介绍Oracle Listener 动态注册 与 静态注册,包括了Oracle Listener 动态注册 与 静态注册的使用技巧和注意事项,需要的朋友参考一下 一.什么是注册 注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。 在数据库服务器启动过程中,
问题内容: 我正在使用JUnit编写一些测试用例。我需要初始化一些静态变量,这些变量将用于该类中的所有测试用例。 为此,我可以使用 静态初始化程序块或 静态方法 相互使用有什么好处? 问题答案: 或初始值设定项的语义非常不同。 静态初始化器由JVM而不是JUnit调用。如果在静态初始化程序中引发了异常,则测试框架可能无法捕获并报告该异常。此外,与该方法相比,静态初始化程序的调用时间没有明确定义。