[20220811]奇怪的隐式转换问题(12c补充测试).txt

[20220811]奇怪的隐式转换问题(12c补充测试).txt

–//生产系统遇到一个奇怪的隐式转换问题,问题在于没有发生隐式转换,前面已经做了一些分析增加12c下的测试情况.

–//我当时的猜测如下:
–//也许oracle 19c版本支持这样的操作,当带入日期类型参数是timestamp类型时,如果秒后面的值全部是0,可以当作date类型使用。
–//导致不会发生隐式转换,我估计oracle估计遇到这样的情况有点多,做了这样的改进,规避了这个问题,在执行时探测绑定变量,避
–//免了隐式转换的发生。

–//后记:测试的结果说明我有点想当然了,实际上从12.2版本开始,oracle就支持这样的情况,当使用绑定变量时,带入的绑定变量参
–//数是timestamp类型时,不再存在隐式转换。即使秒后面的值非0!!

–//我看了我以前写的[20191219]oracle timestamp数据类型的存储.txt=>
–//如果秒后面的值是0,存储占用7个字节。

–//在家里仅仅有12c的环境,做一些补充测试:

1.环境:
SCOTT@test01p> @ ver1
PORT_STRING VERSION BANNER CON_ID
13 3pdjz4fgwwfj2 SELECT /+ test1 / COUNT() FROM EMPX WHERE HIREDATE = :B1
13 0juh2dbyx948s SELECT /
+ test2 / COUNT() FROM EMPX WHERE HIREDATE = :B1
13 f04fd6q8z7n9w SELECT /+ test3 / COUNT() FROM EMPX WHERE HIREDATE = :B1
13 f3gx0d2rfn9sb SELECT /
+ test4 / COUNT() FROM EMPX WHERE HIREDATE = :B1

$ echo 3pdjz4fgwwfj2 0juh2dbyx948s f04fd6q8z7n9w f3gx0d2rfn9sb | tr ‘ ‘ ‘\n’ | xargs -IQ sqlplus scott/btbtms@test01p @ dpc Q ” ” | egrep I_EMPX_HIREDATE
| 2 | INDEX RANGE SCAN| I_EMPX_HIREDATE | 1 | 8 | 1 (0)| 00:00:01 |
|
2 | INDEX RANGE SCAN| I_EMPX_HIREDATE | 1 | 8 | 1 (0)| 00:00:01 |
| 2 | INDEX RANGE SCAN| I_EMPX_HIREDATE | 1 | 8 | 1 (0)| 00:00:01 |
|
2 | INDEX RANGE SCAN| I_EMPX_HIREDATE | 1 | 8 | 1 (0)| 00:00:01 |
–//恩,真心彻底颠覆我的认知,12c下就可以避免这种形式的隐式转换.并且4种timestamp形式都可以,只要使用绑定变量就ok。

SCOTT@test01p> @ dpc f3gx0d2rfn9sb ” ”
PLAN_TABLE_OUTPUT
SELECT /+ test4 / COUNT() FROM EMPX WHERE HIREDATE = :B1
Plan hash value: 3602029756
| 0 | SELECT STATEMENT | | | | 1 (100)| |
| 1 | SORT AGGREGATE | | 1 | 8 | | |
|
2 | INDEX RANGE SCAN| I_EMPX_HIREDATE | 1 | 8 | 1 (0)| 00:00:01 |
1 – SEL$1
2 – SEL$1 / EMPX@SEL$1
Peeked Binds (identified by position):
2 – access(“HIREDATE”=:B1)

SCOTT@test01p> @ bind_cap f3gx0d2rfn9sb ”
SQL_ID CHILD_NUMBER WAS NAME POSITION MAX_LENGTH LAST_CAPTURED DATATYPE_STRING VALUE_STRING C30
0

SCOTT@test01p> @dpc ” ” ”
PLAN_TABLE_OUTPUT
select count() from empx where hiredate = timestamp ‘1980-12-17
00:00:00.000001001’
Plan hash value: 36332186
| 0 | SELECT STATEMENT | | | | 3 (100)| |
| 1 | SORT AGGREGATE | | 1 | 8 | | |
|
2 | TABLE ACCESS FULL| EMPX | 1 | 8 | 3 (0)| 00:00:01 |
1 – SEL$1
2 – SEL$1 / EMPX@SEL$1
Predicate Information (identified by operation id):
Bind#0
oacdty=180 mxl=11(11) mxlc=00 mal=00 scl=00 pre=00
oacflg=11 fl2=8000000 frm=00 csi=00 siz=16 off=0
kxsbbbfp=33849e88 bln=11 avl=11 flg=05
value=1980-12-17 00:00:00.

–//value后面有1个小数点.

Peeked Binds

Bind variable information
position=1
datatype(code)=180
datatype(string)=TIMESTAMP
max length=11

4.打开statistics_level = all看看:

@ dpc f3gx0d2rfn9sb ” ”
..

SQL_ID f3gx0d2rfn9sb, child number 1
| Id | Operation | Name | Starts | E-Rows |E-Bytes| Cost (%CPU)| E-Time | A-Rows | A-Time |
–//buffers列都没有,也就是逻辑读应该为0,这样的情况连索引都没有探察。

SCOTT@test01p> @ dpc 3pdjz4fgwwfj2 ” ”
PLAN_TABLE_OUTPUT
SELECT /+ test1 / COUNT() FROM EMPX WHERE HIREDATE = :B1
Plan hash value: 3602029756
| 0 | SELECT STATEMENT | | 1 | | | 1 (100)| | 1 |00:00:00.01 | 1 |
| 1 | SORT AGGREGATE | | 1 | 1 | 8 | | | 1 |00:00:00.01 | 1 |
|
2 | INDEX RANGE SCAN| I_EMPX_HIREDATE | 1 | 1 | 8 | 1 (0)| 00:00:01 | 1 |00:00:00.01 | 1 |
8 drk7cbdh2c24u SELECT /+ test5 / COUNT(*) FROM EMPX WHERE HIREDATE = :B1

SCOTT@test01p> @ 10053x drk7cbdh2c24u 0
PL/SQL procedure successfully completed.

–//检查跟踪文件发现如下内容:


Peeked values of the binds in SQL statement


Original: https://www.cnblogs.com/lfree/p/16581342.html
Author: lfree
Title: [20220811]奇怪的隐式转换问题(12c补充测试).txt

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606238/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ADB和Fastboot最新版的谷歌官方下载链接

    最新ADB及Fastboot版本说明(SDK Platform Tools 版本说明) ADB和Fastboot for Windows ADB和Fastboot for Mac …

    Linux 2023年6月7日
    097
  • 一文剖析HTML块和内联元素以及DIV容器,运维开发必备前端技能,基本功强化训练。

    写在开篇 运维开发必备前端技能!虽然很枯燥,知识点很多,但要坚持住哦!笔者和大家一起坚持。本篇和大家一起巩固html中的块元素和内联元素以及DIV容器。 块元素 块元素的特点是啥?…

    Linux 2023年6月7日
    0109
  • linux内核源代码组织结构

    linux版本 linux 3.6.24 第一个数字主版本号 第二个数字是偶数代表是稳定版 第三个代表修订次数 Original: https://www.cnblogs.com/…

    Linux 2023年6月7日
    097
  • Redis入门讲解(介绍、安装、常用命令)

    Redis入门讲解(介绍、安装、常用命令) Redis是非关系型数据库 关系型数据库 关系型数据库是采用了关系模型来组织数据的数据库,以行和列的形式存储数据,由二维表及其之间的关系…

    Linux 2023年6月6日
    0102
  • mysql基本操作

    mysql常用命令: 1查询数据库 show database; 2切换库 use test; 3查看库里的表 show tables; 4查看表里的字段 desc tb_name…

    Linux 2023年6月6日
    090
  • 05-ElasticSearch高级搜索

    * package com.coolman.hotel.test; import com.coolman.hotel.pojo.HotelDoc; import com.faste…

    Linux 2023年6月7日
    0103
  • TELE poj1155 题解

    很明显,这道题是以1为根的树,存在最优子问题,因此考虑树形DP。 先看一下样例 常识:利润=收入-成本,也就是:叶节点点权-边权 那么更加明显用dp[i][j]来记录在以i为根节点…

    Linux 2023年6月6日
    091
  • gitlab备份迁移与升级

    bash;gutter:false; 升级计划: https://docs.gitlab.com/ee/update/index.html#upgrade-paths</p&…

    Linux 2023年6月7日
    067
  • Linux命令篇-wc 命令

    wc – print newline, word, and byte counts for each file wc: 统计文件的 &#x5B57;&#…

    Linux 2023年6月13日
    091
  • IDEA 无法显示 Run Dashboard 的解决方法

    前言 最近开始接触微服务的项目,项目很多有时候本地调测需要启动多个项目,看到同事都是使用dashboard管理项目,服务和端口排列的整整齐齐。但是我dashboard里面啥都没有,…

    Linux 2023年6月14日
    0107
  • sed与awk命令

    1.1 sed命令语法 在看单个命令以前,需要回顾一下关于所有sed命令的两点语法。在上一个章中,我们介绍了其大部分内容。行地址对于任何命令都是可选的。它可以使一个模式,被描述为由…

    Linux 2023年6月7日
    0101
  • 聊聊 Netty 那些事儿之 Reactor 在 Netty 中的实现(创建篇)

    本系列Netty源码解析文章基于 4.1.56.Final版本 在上篇文章《聊聊Netty那些事儿之从内核角度看IO模型》中我们花了大量的篇幅来从内核角度详细讲述了五种 IO&am…

    Linux 2023年6月6日
    086
  • Android so(ELF)文件解析

    一、前言 so文件是啥?so文件是elf文件,elf文件后缀名是 .so ,所以也被chang常称之为 so&#x6587;&#x4EF6;,elf文件是linux…

    Linux 2023年6月8日
    096
  • ECMAScript 6.0

    本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。 博主的文章没有高度、深度和广度,只是凑字数。由于博主的水平不高,不足和错误之处在所难免,希望大家能够批评指出。 博主…

    Linux 2023年6月13日
    084
  • [Linux] 如何在 Linux 电脑上制作专业的视频教程

    前言 1、软件工具准备 a. 录音软件 b. 录屏软件 c. 摄像头软件 d. 安卓屏幕操作软件 e. 视频剪辑软件 2、视频教程制作 3、效果 参考链接 前言 博主使用 Arch…

    Linux 2023年6月8日
    0103
  • springboot系列十一、redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

    一、redisTemplate和stringRedisTemplate对比 RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据…

    Linux 2023年5月28日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球