[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)

大家都在看

  • vsftpd配置FTP服务器(Centos7.x安装)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    089
  • ASP.NET Core 3.0 : 二十五. TagHelper

    什么是TagHelper?这是ASP.NET Core 中新出现的一个名词,它的作用是使服务器端代码可以在Razor 文件中参与创建和呈现HTML 元素。(ASP.NET Core…

    Linux 2023年6月7日
    0102
  • 【转】我是一个CPU:这个世界慢!死!了!

    简介 经常听到有人说磁盘很慢、网络很卡,这都是站在人类的感知维度去表述的,比如拷贝一个文件到硬盘需要几分钟到几十分钟,够我去吃个饭啦;而从网络下载一部电影,有时候需要几个小时,我都…

    Linux 2023年6月16日
    0151
  • windows环境下启动多个redis服务(搭建redis集群)

    windows环境下启动多个redis服务(搭建redis集群一) 最终效果:本地安装好3个(多个)端口的redis服务。 1.下载并安装Redis 下载地址:https://gi…

    Linux 2023年5月28日
    099
  • docker compose容器编排

    Docker Compose (可简称Compose)是一个定义与运行复杂应用程序的 Docker 工具,是 Docker 官方 编排&…

    Linux 2023年6月8日
    0104
  • 2018部分

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    089
  • Linux使用SNAT实现局域网上网

    1、一台能上网的Linux机器 2、操作步骤 host-10-11 配置snat,开启路由转发 iptables -t nat -A POSTROUTING -s 10.10.10…

    Linux 2023年6月6日
    0100
  • 大数据Hadoop集群的扩容及缩容(动态添加删除节点)

    添加白名单和黑名单 白名单,表示在白名单的主机IP地址可以用来存储数据 企业中;配置白名单,可以尽量防止黑客恶意访问攻击。 配置白名单步骤如下:原文:sw-code 1)在Name…

    Linux 2023年6月8日
    0134
  • pycharm 设置默认换行符

    作者:Outsrkem原文链接:https://www.cnblogs.com/outsrkem/p/16488693.html本文版权归作者所有,欢迎转载,但未经作者同意必须保留…

    Linux 2023年6月6日
    0113
  • Redis的Docker安装及基本使用

    Redis 端口 6379 通过以下命令启动一个简单的Redis容器 docker run –name some-redis -d -p 6379:6379 redis:6.2….

    Linux 2023年5月28日
    091
  • 快速构建Web应用,从零学习React后台项目模版

    想要快速构建实际应用,离不开一个好的应用模版,React作为大厂出品工具,有着稳定性和可维护性的保障,同时可以使用相关的全套全家桶(React + React-router + A…

    Linux 2023年5月27日
    094
  • Spring Boot yaml配置文件解析

    1、Spring Boot 配置文件类型和作用 2、yaml 配置文件简介 3、yaml 基础语法 3.1、配置【基本】数据类型 3.2、配置【Object、Map】数据类型 3….

    Linux 2023年6月8日
    0101
  • 实验一 密码引擎-4-国䀄算法交叉测试

    任务详情 0 2人一组,创建一个文件,文件名为小组成员学号,内容为小组成员学号和姓名1 在Ubuntu中使用OpenSSL用SM4算法加密上述文件,然后用龙脉eKey解密,提交代码…

    Linux 2023年6月8日
    0103
  • 定时备份Docker中的MySQL数据库

    新建脚本 mysql_bak.sh mysql 为docker中的mysql容器名 #!/bin/bash docker_name=mysql data_dir="/op…

    Linux 2023年6月14日
    0110
  • ThinkPHP5 远程命令执行漏洞

    一、ThinkPHP介绍 轻量级框架,内部OOP和面向过程代码都存在,是国人自己开发的框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,…

    Linux 2023年6月14日
    080
  • postgresql 自增列 初始值设置

    — 获取自增列的名称 SELECT pg_get_serial_sequence(‘table_name’, ‘id’) AS sequence_name; –获取自增列的下一…

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