热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle优化实战(绑定变量)

绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中librarycache的过度耗用以提高性能。然刀子磨的太快,使起来锋利,却容

绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中librarycache的过度耗用以提高性能。然刀子磨的太快,使起来锋利,却容

绑定变量是Oracle解决硬解析的首要利器,能解决OLTP系统中librarycache的过度耗用以提高性能。然刀子磨的太快,使起来锋利,却容易折断。凡事皆有利弊二性,因地制宜,因时制宜,全在如何权衡而已。本文讲述了绑 定变量的使用方法,以及绑定变量的优缺点、使用场合。

一、绑定变量

提到绑定变量,就不得不了解硬解析与软解析。硬解析简言之即一条SQL语句没有被运行过,处于首次运行, 则需要对其进行语法分析,语义识别,跟据统计信息生成最佳的执行计划,然后对其执行。而软解析呢,则是由 于在librarycache已经存在与该SQL语句一致的SQL语句文本、运行环境,即有相同的父游标与子游标,采用拿来主义,直接执行即可。软解析同样经历语法分析,语义识别,且生成hashvalue,接下来在librarycache搜索相同的hashvalue,,如存在在实施软解析。

C:\Users\mxq>sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production on 星期六 5月 30 20:16:40 2015

Copyright (c) 1982, 2011, Oracle. All rights reserved.

连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

清空以前共享池数据
SQL> alter system flush shared_pool;

System altered

SQL> select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=1817156
1555;

CUST_ID
----------
467
467
467

SQL> select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=1810839
9505;

未选定行

SQL> select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=1897116
7925;

未选定行

在下面可以看到oracle把没条执行都重新硬解析一遍生成三个值,这样效率不高
SQL> select sql_text,hash_value from v$sql where sql_text like '%dest_addr=18%';

SQL_TEXT
--------------------------------------------------------------------------------

HASH_VALUE
----------
select sql_text from v$sql where sql_text like '%dest_addr=18%'
261357771

select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=18108399505
2971670234

select * from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=18171561555
4160363108

SQL> select sql_text,hash_value from v$sql where sql_text like '%dest_addr=18%';

SQL_TEXT HASH_VALUE
-------------------------------------------------------------------------------- ----------

select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=18971167925 3796536237
select * from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=18108399505 2768207417
select * from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=18171561555 2177737916

在这里开始使用绑定变量
SQL> var dest number;
SQL> exec :dest:=15392107000;

PL/SQL procedure successfully completed
dest
---------
15392107000

SQL> select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=:dest;

CUST_ID
---------
dest
---------
15392107000

SQL> exec :dest:=15310098199;

PL/SQL procedure successfully completed
dest
---------
15310098199

SQL> select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=:dest;

CUST_ID
---------
dest
---------
15310098199

生成一个值说明oracle只硬解析一遍
SQL> select sql_text,hash_value from v$sql where sql_text like '%dest_addr=:dest%';

SQL_TEXT HASH_VALUE
-------------------------------------------------------------------------------- ----------
select sql_text,hash_value from v$sql where sql_text like '%dest_addr=:dest%' 627606763
select cust_id from T_SMSGATEWAY_MT where cust_id=467 and dest_addr=:dest 1140441667

结论:
绑定变量可以有效消除硬解析

本文永久更新链接地址

推荐阅读
  • 本文深入探讨了 AdoDataSet RecordSet 的序列化与反序列化技术,详细解析了将 RecordSet 转换为 XML 格式的方法。通过使用 Variant 类型变量和 TStringStream 流对象,实现数据集的高效转换与存储。该方法不仅提高了数据传输的灵活性,还增强了数据处理的兼容性和可扩展性。 ... [详细]
  • 在编写SQL查询时,常遇到某些语句无法调用别名的问题。这主要是因为SQL和MySQL中的别名机制存在差异所致。为避免类似错误再次发生,本文汇总了相关技术资料,详细解析了别名调用的限制及其背后的原理,提供了实用的解决方案和最佳实践建议。 ... [详细]
  • sh cca175problem03evolveavroschema.sh ... [详细]
  • 深入解析MySQL Replication中的并行复制机制与实例应用【MySQL进阶教程】
    本文深入探讨了MySQL 5.6版本后引入的并行复制机制,详细解析了其工作原理及优化效果。通过具体实例,展示了如何在实际环境中配置和使用并行复制,以提高数据同步效率和系统性能。 ... [详细]
  • 本文深入解析了 Python 爬虫技术在 B 站数据挖掘中的应用,通过分析海量用户行为和内容数据,揭示了热门 UP 主成功的背后因素。Python 作为一种强大的编程语言,其面向对象和解释执行的特点使其成为数据抓取和处理的理想选择。文章详细介绍了如何利用 Python 爬虫技术获取 B 站的数据,并通过数据分析方法,探讨了热门 UP 主的创作策略和互动模式,为内容创作者提供了有价值的参考。 ... [详细]
  • 点击上方蓝色“程序猿DD”,选择“设为星标”回复“资源”获取独家整理的学习资料!来源|https:github.comwizardbyronprinci ... [详细]
  • 本文探讨了在 SQL 中将中文字符转换为拼音首字母的有效方法和技巧。通过使用特定的函数和算法,可以实现中文名称的快速拼音首字母提取,从而提高数据处理的效率和准确性。文中还提供了具体的示例和代码片段,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 在 Asp.net 应用中,动态加载 DropDownList 控件的数据源是一项常见需求。本文探讨了如何高效地从数据库中获取数据,并实时更新下拉列表,确保用户界面始终与后台数据保持同步。通过使用 ADO.NET 和 LINQ to SQL 技术,开发者可以轻松实现这一功能,同时提高应用的性能和用户体验。文中还提供了代码示例和最佳实践,帮助开发者解决常见的数据绑定问题。 ... [详细]
  • 深入解析 SQL Server 中的聚合函数 SUM() 使用方法与技巧 ... [详细]
  • 本文提供了Oracle数据库日常管理和操作的实用指南,详细介绍了如何创建表的SQL代码示例,例如:`CREATE TABLE test (id VARCHAR2(10), age NUMBER);` 同时,还涵盖了数据表的基本维护、索引优化及常见问题解决策略,旨在帮助数据库管理员提升工作效率和数据管理能力。 ... [详细]
  • Oracle培训(三十七)——深入解析Hibernate第三章:实体关联关系映射详解
    在本节Oracle培训中,我们将深入探讨Hibernate第三章的内容,重点讲解实体关联关系映射的详细知识点。首先,回顾了Hibernate的基本概念和映射基础,随后详细分析了不同类型的实体关联关系,包括一对一、一对多和多对多关系的映射方法及其应用场景。通过具体的示例和代码片段,帮助读者更好地理解和掌握这些复杂的映射技术。此外,还讨论了如何优化关联关系的性能,以及常见的问题和解决方案。 ... [详细]
  • MySQL 5.6 引入了全局事务标识符(GTID)和多线程复制机制,显著提升了数据库的可靠性和性能。GTID 作为一种新的事务标识方式,确保了事务在主从节点间的一致性,避免了传统基于日志位置的复制可能出现的问题。多线程复制则通过并行处理多个复制任务,大幅提高了复制效率,特别是在大型数据库环境中表现更为突出。这些新特性不仅增强了 MySQL 的高可用性和扩展性,还为数据库管理带来了更多灵活性和便利性。 ... [详细]
  • 在“跃迁之路”专栏中,我们将继续深入探讨SQL习题,本期重点是巩固MySQL多表查询的基础。具体操作包括创建一个名为`day09_exercise`的数据库,以帮助读者更好地理解和实践相关知识点。通过这一练习,读者可以进一步提升对多表查询的理解和应用能力。 ... [详细]
  • 在解决Android应用程序中的ANR问题时,我引入了StrictMode机制。尽管之前未曾使用过这一工具,但通过实践发现它能有效检测并定位性能瓶颈。日志中出现的两个违规记录,除了前四行信息和持续时间存在差异外,还可能涉及不同的线程或操作类型。深入理解这些差异有助于更好地优化应用性能。 ... [详细]
  • 优化后的标题:封装游标存储过程以提升SQL执行效率(Pr_execsql2) ... [详细]
author-avatar
0o可人儿o0_962
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有