oracle sql调优之绑定变量用法举例

这篇具有很好参考价值的文章主要介绍了oracle sql调优之绑定变量用法举例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Oracle绑定变量是一种在SQL语句中使用变量的方法,它可以提高SQL语句的执行效率、简化编程过程,并且可以防止SQL注入攻击。

绑定变量的作用是将变量的值与SQL语句分离开来,避免在每次执行SQL语句时都需要重新解析和编译SQL语句,从而提高SQL语句的执行效率。在使用绑定变量时,可以使用冒号(:)来引用变量名,例如:myVariable

在执行SQL语句时,需要在绑定变量前面加上冒号,例如SELECT * FROM myTable WHERE myColumn = :myVariable。绑定变量可以使用在各种SQL语句中,包括SELECTINSERTUPDATEDELETE等。

除了提高SQL执行效率外,绑定变量还可以防止SQL注入攻击,因为绑定变量会将用户输入的值作为变量处理,而不是将其作为字符串直接嵌入到SQL语句中,从而避免了SQL注入攻击。

绑定变量是Oracle数据库中使用频率较高的技术之一,对于需要频繁使用SQL语句的开发者来说,掌握绑定变量的用法是非常重要的。

oracle 中,对于一个提交的sql语句,存在两种可选的解析过程一种叫做硬解析,一种叫做软解析.


一个硬解析需要经解析,制定执行路径,优化访问计划等许多的步骤.硬解释不仅仅耗费大量的cpu,更重要的是会占据重要的们闩(latch)资源,严重的影响系统的规模的扩大(即限制了系统的并发行), 而且引起的问题不能通过增加内存条和cpu的数量来解决。

之所以这样是因为门闩是为了顺序访问以及修改一些内存区域而设置的,这些内存区域是不能被同时修改。当一个sql语句提交后,oracle会首先检查一下共享缓冲池(shared pool)里有没有与之完全相同的语句,如果有的话只须执行软分析即可,否则就得进行硬分析。


而唯一使得oracle 能够重复利用执行计划的方法就是采用绑定变量。绑定变量的实质就是用于替代sql语句中的常量的替代变量。绑定变量能够使得每次提交的sql语句都完全一样。

绑定变量只是起到占位的作用,同名的绑定变量并不意味着在它们是同样的,在传递时要考虑的是传递的值与绑定变量出现顺序的对位,而不是绑定变量的名称。

绑定变量是在通常情况下能提升效率,非正常的情况如下:

在字段(包括字段集)建有索引,且字段()的集的势非常大(也就是有个值在字段中出现的比例特别的大)的情况下,使用绑定变量可能会导致查询计划错误,因而会使查询效率非常低。这种情况最好不要使用绑定变量。

但是并不是任何情况下都需要使用绑定变量,下面是两种例外情况:
1.对于隔相当一段时间才执行一次的SQL语句,这是利用绑定变量的好处会被不能有效利用优化器而抵消
2.数据仓库的情况下。

绑定变量不能当作嵌入的字符串来使用,只能当作语句中的变量来用。不能用绑定变量来代替表名、过程名、字段名等.

从效率来看,由于oracle10G放弃了RBO,全面引入CBO,因此,在10G中使用绑定变量效率的提升比9i中更为明显。

举例:


普通sql语句:

SELECT fname, lname, pcode FROM cust WHERE id = 674;
SELECT fname, lname, pcode FROM cust WHERE id = 234;
SELECT fname, lname, pcode FROM cust WHERE id = 332;

含绑定变量的sql 语句:
SELECT fname, lname, pcode FROM cust WHERE id = :cust_no;

Sql*plus 中使用绑定变量:


SQL> set timing on

SQL> variable x number;

SQL> exec :x :=8

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.03

SQL> select * from A;

ID

----------

已用时间: 00: 00: 00.06

SQL> insert into A values(:x);

已创建行。

已用时间: 00: 00: 00.01

SQL> select * from A;

ID

----------

已用时间: 00: 00: 00.01


PL/SQL很多时候都会自动绑定变量而无需编程人员操心,即很多你写得sql语句都会自动利用绑定变量,如下例所示:
SQL> Set timing on

SQL> declare

2 I NUMBER;

3 BEGIN

4 FOR I IN 1..1000 LOOP

5 INSERT INTO A VALUES(I);

6 end loop;

7 end;

8 /

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.12

这段代码是不需要使用绑定变量的方法来提高效率的,ORACLE会自动将其中的变量绑定。

SQL> create table D ( id varchar(10));

表已创建。

已用时间: 00: 00: 00.50

SQL> declare

2 i number;

3 sqlstr varchar(2000);

4 begin

5 for i in 1..1000 loop

6 sqlstr :=' insert into d values('||to_char(i)||')';

7 execute immediate sqlstr;

8 end loop;

9 end;

10 /

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.68

这段代码同样是执行了1000insert语句,但是每一条语句都是不同的,因此ORACLE会把每条语句硬解析一次,其效率就比前面那段就低得多了。如果要提高效率,不妨使用绑定变量将循环中的语句改为

SQL> declare

2 i number;

3 sqlstr varchar(2000);

4 begin

5 for i in 1..1000 loop

6 sqlstr :=' insert into d values(:i)';

7 execute immediate sqlstr using i;

8 end loop;

9 end;

10 /

PL/SQL 过程已成功完成。

已用时间: 00: 00: 00.18

这样执行的效率就高得多了。

PL/SQL中,引用变量即是引用绑定变量。但是在pl/sql中动态sql并不是这样。


vbjava以及其他应用程序中都得显式地利用绑定变量。
对于绑定变量的支持不仅仅限于oracle,其他RDBMSSQL SERVER也支持这一特性。
文章来源地址https://www.toymoban.com/news/detail-554950.html

到了这里,关于oracle sql调优之绑定变量用法举例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Hive调优之小表Join大表

    1、小表join大表 将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率,再进一步可以使用group 让小的维表(1000条以下的记录条数)先进内存,在map端完成reduce。 2、多个表关联 多个表关联时,最好拆分成小段,避免大sql(无法控制中间

    2024年02月04日
    浏览(37)
  • Hive调优之计算资源配置(一)

    计算资源的调整主要包括Yarn和MR。 1、Yarn配置说明   需要调整的Yarn参数均与CPU、内存等资源有关,核心配置参数如下 (1)yarn.nodemanager.resource.memory-mb   该参数的含义是,一个NodeManager节点分配给Container使用的内存。该参数的配置,取决于NodeManager所在节点的总内存容量

    2024年02月16日
    浏览(33)
  • ClickHouse性能调优之排序和数据类型

    每个DBA都关心数据库性能调优,我们知道不同数据类型可以描述不能业务场景,同时也影响数据访问和有效存储。ClickHoue支持高级压缩算法提升速度和降低存储成本,优化ClickHoue存储架构提升内存和网络带宽的性能。那我们如何选择压缩算法和数据类型呢? 创建表并指定排序

    2024年02月10日
    浏览(43)
  • GreenPlum中性能调优之shared_buffers修改

    问题背景:刚刚安装完的GreenPlum集群默认shared_buffers为128MB,为了提升系统性能需要修改。 shared_buffers:该参数决定了 Greenplum 数据库在内存中缓存数据的大小。建议将该参数设置为总内存的 25% 左右。官方文档中建议修改为机器物理内存的1/8-1/4,书籍推荐10-25%。 查看当前数据

    2024年02月09日
    浏览(46)
  • sql中with as用法/with-as 性能调优/with用法

    with as 语句是SQL中的一种常用语法, 它可以为一个查询结果或子查询结果创建一个临时表 ,并且可以在后续的查询中使用这个临时表,在查询结束后该临时表就被清除了。这种语法的使用可以使得复杂的查询变得简单,同时也可以提高查询效率。 WITH AS短语,也叫做子查询部

    2024年02月16日
    浏览(39)
  • 性能调优之JMH必知必会3:编写正确的微基准测试用例

      性能调优之JMH必知必会1:什么是JMH 性能调优之JMH必知必会2:JMH的基本用法 性能调优之JMH必知必会4:JMH的高级用法 性能调优之JMH必知必会5:JMH的Profiler       在前面两篇文章中分别介绍了什么是JMH、JMH的基本法。现在来介绍JMH正确的微基准测试用例如何编写。【 单位

    2023年04月08日
    浏览(44)
  • vue - 动态绑定ref(使用变量)以及获取方式,解决v-for循环嵌套自定义子组件时无法this.$refs.xx找到动态组件的情况(详细示例教程)适合 vue.js nuxt.js uniapp

    正常情况,我们需要在vue中获得某个dom或者组件,我们会通过绑定 ref 然后通过绑定后的名字来获取这个dom 。 但是,如果我们在v-for中绑定ref的话,那么这个ref就会存在多个,比如我们点击事件让对应的显示/隐藏的话,我们很难找到这个对应的元素。 那么,这时我们需要动

    2024年02月13日
    浏览(51)
  • ES6: Symbol概念与用法举例

    概念: ES6 引入了一种新的原始数据类型 Symbol ,表示独一无二的值。 1- 使用Symbol作为对象属性名 举例理解: a.给对象添加独一无二的属性 b. 便于定义公共库 这里封装属性和方法时, 全部采取Symbol类型, 这样别人就算往里面加name、age等同名的属性或方法, 也不会影响对象原本使

    2024年02月15日
    浏览(34)
  • Linux tail命令详解和高级用法举例

    目            录 一、概述 二、tail命令解释 1.命令格式; 2.功能 3.选项 4.选项的基本用法 (1) 显示行号 (2)忽略指定字符数 (3) 不显示文件名 三.基本功能 1、基本用法 (1) 查看文件末尾内容 (2) 实时监控文件变化 2、高级用法 (1)组合使用1:把一个应用程

    2024年01月16日
    浏览(45)
  • 微信小程序日历插件用法-举例为(爸妈搜日历)

    一、添加插件 在小程序管理后台添加插件。 小程序管理后台地址:https://mp.weixin.qq.com/ 设置第三方设置插件管理 添加插件,可以直接搜索名称(爸妈搜日历)或者AppID(wx23a9cef3522e4f7c) 二、在小程序app.json文件中引入插件声明 三、在需要使用插件的小程序页面的JSON配置文件中,增

    2024年02月10日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包