Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >第一篇 热身--隐式类型转换还是其他?

第一篇 热身--隐式类型转换还是其他?

作者头像
老虎刘
发布于 2022-06-22 09:28:23
发布于 2022-06-22 09:28:23
1960
举报

前几天,有个给运营商做维护的DBA小陈问:

刘老师,我这个SQL不能使用索引,你帮我确认一下,是不是遇到了“隐式类型转换”?然后发了一个执行计划的最后部分给我看:

Peeked Binds (identified by position):

--------------------------------------

1 - :V1 (VARCHAR2(30), CSID=852): '4000874'

2 - :V2 (VARCHAR2(30), CSID=852): '4000874'

Predicate Information (identified by operation id):

---------------------------------------------------

4 - filter(("RATABLE_RESOURCE_ID"=TO_NUMBER(:V1) OR "TRANSFER_RESOURCE_ID"=TO_NUMBER(:V2)))

我说没错,确实是有隐式类型转换。但是,这个隐式类型转换却是“无害”的,因为如果字段是number类型,绑定变量是varchar2类型,这种隐式类型转换是不会影响SQL执行计划的。而如果字段是varchar2类型,绑定变量是number类型,这种才是最危险的。

小陈接下来发了完整的SQL,并告知第一个谓词条件字段(红色)上有主键:

SELECT

......

FROM hss.tb_bil_ratable_resource

WHERE ratable_resource_id = '4000874' OR transfer_resource_id = '4000874';

我一看SQL,马上就明白是什么原因了:这个SQL如果要想使用索引,必须还要创建另一个谓词条件字段(transfer_resource_id)上的索引。

小陈创建完索引后很快就发消息说搞定了!

解释:

因为两个谓词条件之间的关系是OR,而不是通常见到的AND,如果是AND,不用创建另一个字段上的索引就可以使用已经存在的主键索引。

总结:

这个SQL虽然非常简单,但是如果没有理解OR和AND的区别,还是会比较迷惑。而且客户之前被隐式类型转换折腾过几次,这次发现一个,可惜却不是根因。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-07-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
隐式数据类型转换案例一则
在OLTP系统中,要求对频繁执行的SQL使用绑定变量(唯一值少的字段,如type、status等,数据分布不均是常见情况,这种字段不建议使用绑定变量)。
老虎刘
2022/06/22
4750
隐式数据类型转换案例一则
【DB笔试面试586】在Oracle中,什么是自适应游标共享(3)?
从如下查询结果可以看到目标SQL对应的列VERSION_COUNT的值从之前的5变为了现在的6,列EXECUTIONS的值为7,说明Oracle在第7次执行目标SQL时依然用的是硬解析。从查询结果可以看到,Oracle此时新生成了一个CHILD_NUMBER为5的Child Cursor,并且把存储相同执行计划的CHILD_NUMBER为4的原有Child Cursor标记为非共享。
AiDBA宝典
2019/09/29
3920
【DB笔试面试586】在Oracle中,什么是自适应游标共享(1)?
绑定变量窥探的副作用就在于,使用了绑定变量的目标SQL只会沿用之前硬解析时所产生的解析树和执行计划,即使这种沿用完全不适合于当前的情形。在Oracle 10g及其后续的版本中,Oracle会自动收集直方图统计信息,这意味着与之前的版本相比,在Oracle 10g及其后续的版本中Oracle有更大的概率会知道目标列实际数据的分布情况,也就是说绑定变量窥探的副作用将会更加明显。当Oracle执行绑定变量窥探操作时绑定变量所对应的输入值是否具有代表性就至关重要了(这里“代表性”是指该输入值所对应的执行计划和该SQL在大多数情况下的执行计划相同),因为这会直接决定此目标SQL在硬解析时所选择的执行计划,进而决定后续以软解析/软软解析重复执行时所沿用的执行计划。
AiDBA宝典
2019/09/29
7540
殊途同归:如何获得一个SQL的真实执行计划
崔华,网名 dbsnake Oracle ACE Director,ACOUG 核心专家 如何查看一个sql的真实执行计划呢?用dbms_xplan.display_cursor(‘hash_value’,‘child_number’, 'advanced')是其中的一种很重要的方法。 我负责的一个库,在移植了大量数据后,跑最后一个运维作业的时候这个运维作业始终阻塞在这样的一个sql上: update saldat setsdaprs ='C',sdatno = :4 where
数据和云
2018/03/06
1K0
殊途同归:如何获得一个SQL的真实执行计划
【DB笔试面试586】在Oracle中,什么是自适应游标共享(2)?
另外,在目标列有Frequency类型直方图的前提条件下,如果对目标列施加等值查询条件,且该查询条件的输入值等于该列的某个实际值时,则该谓词条件的可选择率的计算公式为如下所示:
AiDBA宝典
2019/09/29
5690
67-oracle数据库,有索引,但是没有被使用的N种情况,以及应对方法(上篇)
如果说性能优化是数据库技术中的明珠,那么索引无疑是其中最耀眼的一颗,特别是OLTP业务数据库。掌握了索引技术,基本上性能就不会有太大的问题。
老虎刘
2022/06/22
1.1K0
一次有意思的错选执行计划问题定位(涉及SYS_OP_C2)
1. 11g的库,话说有一个应用程序新上线,应用中使用了绑定变量的方式执行一条简单的SQL,例如select a from b where c = :x,c列是该表复合主键的前导列,表定义是varchar2类型,从spotlight监控看这条SQL的执行计划是全表扫描,一次执行要1个小时,这张表是运行很久的引用分区表,数据量是亿级,测试的时候正常,但很显然测试的数据量可能和生产非常不一致,导致没察觉。
bisal
2019/01/29
6670
为什么预估执行计划与真实执行计划会有差异?
一 问题概要 对同一个 SQL 语句的 ExplainPlan 里显示的预估执行计划与通过 V$SQL_PLAN 视图获取的 Runtime Plan 真实执行计划,偶尔会发现两边有不一致的情况,为什么呢?为什么预估执行计划会不准确?怎样才能避免这种情况的发生? 二 问题解答 这是执行计划相关中会被经常问道的问题,也是困扰自己很长时间的问题。希望通过下面的分析能解释一部分原因。 对同一个 SQL 语句的 ExplainPlan 里显示的预估执行计划与通过 V$SQL_PLAN 视图获取的真实执行计划不
数据和云
2018/04/17
8830
为什么预估执行计划与真实执行计划会有差异?
oracle隐式转换_oracle查看游标数量
原文地址:http://blog.itpub.net/29324876/viewspace-1096741/
全栈程序员站长
2022/11/10
2.2K0
如何找到隐式转换的SQL?
我们知道,隐式转换是在开发过程中非常容易进的一种坑,最常见的就是程序中传参类型和数据库表中定义的字段类型不一致,隐患就是不能用到隐式转换字段上的索引,原先能使用索引的语句,却使用了全表,影响执行性能。
bisal
2021/09/06
1.3K0
Oracle优化器对谓词顺序处理的一个场景
最近听了个讲座,其中介绍到了Oracle的谓词,原始版本的例子,如下所示,从数据上能看到,c1='3'的时候,c2的值是个字符串类型的数字,
bisal
2022/03/22
6590
Oracle优化器对谓词顺序处理的一个场景
70-根因分析-oracle数据库突发性能问题,谁来背这个锅
数据库突发性能问题,有时可能通过重启应用、重新收集统计信息、重启数据库等方法得到临时解决,但是,如何把故障根本原因找到,避免故障再次发生,是问题得到完美闭环的一个关键步骤(当然,能够快速恢复业务也是非常关键的一环)。这也是为什么很多对业务稳定性要求非常高的行业(比如金融、通信、铁路、航空等)的数据库系统,购买oracle 售后高服(ACS)中的顶级服务SSC服务的一个主要原因。
老虎刘
2022/06/22
9360
70-根因分析-oracle数据库突发性能问题,谁来背这个锅
Oracle的隐式转换
都说Oracle存在NUMBER和VARCHAR2类型的隐式转换,严格意义上需要避免,但为何需要避免,从下面的实验进行验证。 1. 创建测试表和索引 create table tn (id number, name varchar2(1));
bisal
2019/01/29
1K0
从Java的类型转换看MySQL和Oracle中的隐式转换(二)(r6笔记第68天)
说起数据类型转换,在开发中如此,在数据库中也是如此,之前简单对比过MySQL和Oracle的数据类型转换情况,可以参见MySQL和Oracle中的隐式转换 http://blog.itpub.net/23718752/viewspace-1787973/ 不过当时写完之后,有个读者随口问了一句为什么,为什么呢?似乎自己还是一知半解,说是规则,无规矩不成方圆,倒也无可非议,不过我觉得还是要再看看,看看还能有哪些收获,接下来的内容我就不能保证正确性了,希望大家明辨,也希望提出意见,毕竟就是希望把问题搞明白而已。
jeanron100
2018/03/16
1.1K0
78-生产系统不改代码解决SQL性能问题的几种方法
数据库性能很大一部分跟SQL写法有关, 有些SQL是必须改代码才能优化的, 如果不能改代码, 需要删历史记录,回收空间,让表始终保持相对较小,才能消耗较少的资源,得到能够接受的响应时间.如前公众号文章所述: 必须通过改写SQL才能提升性能的一些情况 (列举了10个需要改写的SQL).
老虎刘
2022/06/22
4800
78-生产系统不改代码解决SQL性能问题的几种方法
Oracle、SQL Server和MySQL的隐式转换异同
这次的组内分享,选择了在不同数据库中的隐式转换这个话题。隐式转换是个老生常谈的问题了,不同的数据库,隐式转换的影响因素有所不同,我们通过一些例子来看一下。但是问题来了,如何避免隐式转换带来的负面影响?一方面是编程习惯的问题,另一方面就需要一些人肉/自动化的手段主动发现问题,如果两者都没有,就只能被动等着出问题,再找解决方案了。
bisal
2021/09/06
1.6K0
Oracle、SQL Server和MySQL的隐式转换异同
【DB笔试面试570】在Oracle中,SQL优化在写法上有哪些常用的方法?
一般在书写SQL时需要注意哪些问题,如何书写可以提高查询的效率呢?可以从以下几个方面去考虑:
AiDBA宝典
2019/09/29
3.9K0
谈谈 MySQL 隐式类型转换
来源:andyqian www.andyqian.com/2017/11/11/database/MySQLConvert/ 前言 今天我们继续回到MySQL系列文章中,谈一谈MySQL中隐式类型转换。(其实我最早知道是在慢SQL优化中知道隐式类型转换概念的),在说隐式类型转换之前,首先我们通过一个实例来看看是怎么回事。 数据结构 本文中所有的操作,都是基于该数据结构(有兴趣的童鞋可以实验): create table t_base_user( oid bigint(20)notnullprimary ke
企鹅号小编
2018/03/05
2.9K0
谈谈 MySQL 隐式类型转换
案例分析:倾斜值传入导致 SQL 资源消耗升高
作者 | 邓秋爽:云和恩墨技术工程师,有超过七年超大型数据库专业服务经验,擅长 Oracle 数据库优化、SQL 优化和 Troubleshooting。
数据和云
2018/07/27
4840
案例分析:倾斜值传入导致 SQL 资源消耗升高
读书笔记-《基于Oracle的SQL优化》-第二章-1
1、目标SQL的正文、SQL ID和其执行计划所对应的的PLAN HASH VALUE。
bisal
2019/01/29
9790
推荐阅读
相关推荐
隐式数据类型转换案例一则
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档