oracle 表字段类型,与业务SQL不合理,导致的隐式转换

今天遇到一个生产问题,业务SQL很简单,单表查询,而且表只有三个字段,有个主键ID,而且通过主键ID过滤,业务页面会传一百多个ID过来调用SQL,这个表数据量大小为100多万,但是偏偏这条SQL执行跑了15秒,完全影响业务不能使用。

select a,b,c from t where t.id in (1111,222,333,444,555..........)

我一开始并没有去查看表设计,而是直接看了执行计划,

1 alter session set statistics_level=all;
2 执行SQL
3 select * from table(dbms_xplan.display_cursor(null,null,‘ALLSTATS LAST‘)

执行计划直接走了全表扫描,而在谓词过滤的信息里有一堆的

to_number(t.id)=1111 or to_number(t.id)=2222 ..............

看到这里立马就猜想到了具体的问题所在,查询T表ID字段,是VARCHAR2类型,而SQL in的是数字类型,SQL直接被隐式转换后,便走不了索引了, 直接走了全表。这个问题后续才发现,也是因为业务不关注,在表数据日益上涨之后,性能问题日益凸显才被抛出来

原文地址:https://blog.51cto.com/2012ivan/2410375

时间: 2024-10-20 16:12:56

oracle 表字段类型,与业务SQL不合理,导致的隐式转换的相关文章

无法确定条件表达式的类型,因为Datetime和<null>之间没有隐式转换

Q: var a=isFilter ? ta.EndDate : null; Error:无法确定条件表达式的类型,因为Datetime和<null>之间没有隐式转换 ta.EndDate是DateTime类型,不能与null选择: A: var a=isFilter ? ta.EndDate : (DateTime?)null;//加在ta.EndDate也是可以的.

MySQL SQL优化之字符串索引隐式转换

之前有用户很不解:SQL语句非常简单,就是select * from test_1 where user_id=1 这种类型,而且user_id上已经建立索引了,怎么还是查询很慢? test_1的表结构: CREATE TABLE `test_1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(30) NOT NULL, `name` varchar(30) DEFAULT NULL, PRIMARY KEY (`id`),

【转】SQL SERVER标量表达式的隐式转换

在SQL Server中的数据类型中,存在着优先级的问题.标量表达示的返回结果类型也会根据操作数的类型而定,如1 +'1'=2.而不是'11',因些Int型的优先级比VARCHAR型的优先级要高.所以在表达示的结果隐式转换成Int型. 同样对于标量函数,如一个表的一列是Int型,表中有两行值为2和3如果对这一列使用AVG函数,则结果是2,而不是2.5.但是如果这一列是Decimal类型的话,那么结果就是2.5.因为结果类型依据操作数据类型. 如下的一个Case语名 CASE WHEN <logi

SQL Server中提前找到隐式转换提升性能的办法

    http://www.cnblogs.com/shanksgao/p/4254942.html 高兄这篇文章很好的谈论了由于数据隐式转换造成执行计划不准确,从而造成了死锁.那如果在事情出现之前发现了这类潜在的风险岂不是更好?     那么我们来看一个简单的例子,如代码清单1所示.   1: SELECT * 2: FROM HumanResources.Employee 3: WHERE NationalIDNumber = 243322160 4:  5: SELECT * 6: FR

SQL Server有意思的数据类型隐式转换问题

写这篇文章的时候,还真不知道如何取名,也不知道这个该如何将其归类.这个是同事遇到的一个案例,案例比较复杂,这里抽丝剥茧,仅仅构造一个简单的案例来展现一下这个问题.我们先构造测试数据,如下所示: CREATE TABLE TEST (   ID    INT,   GOOD_TYPE  VARCHAR(12),   GOOD_WEIGHT NUMERIC(18,2) )   INSERT INTO dbo.TEST VALUES( 1, 'T1',1.27) SELECT  GOOD_TYPE,

SQL执行异常系列之——隐式转换

SQL> select object_id,CREATED from dba_objects where rownum < 10; OBJECT_ID CREATED ---------- ------------------ 20 25-JUL-18 46 25-JUL-18 28 25-JUL-18 15 25-JUL-18 29 25-JUL-18 3 25-JUL-18 25 25-JUL-18 41 25-JUL-18 54 25-JUL-18 9 rows selected. se

无法确定条件表达式的类型,因为“DateTime”和“&lt;null&gt;”之间没有隐式转换|Nullable类型问题与?:条件运算符

Nullable类型问题与?:条件运算符 1.方式1 x.UpdateTime.HasValue ? x.UpdateTime.Value : (DateTime?)null 2.方式2 DateTime? uDT = null; x.UpdateTime.HasValue ? x.UpdateTime.Value : uDT 3.方式3 DateTime? updateTime; if (x.UpdateTime.HasValue) updateTime = x.UpdateTime.Valu

修改非空表字段类型Oracle

执行以下语句报"要修改数据类型,则要更改的列必须为空"       alter table 表名 modify (目标字段 varchar2(100)); 解决步骤: 第一步,在表中加一个临时字段       alter table 表名 add 临时字段 目标字段原来的类型; 第二步,将目标字段的值付给临时字段,并将目标字段置空       update 表名 set 临时字段=目标字段,目标字段=null; 第三步,修改目标类型       alter table 表名  modi

MySQL建表字段类型

1.数据库:在MySQL中,要存储数据,必须从数据库开始,因此首先要创建数据库,但由于学校的MySQL服务器对学生数据帐号有限止,学生不得创建数据库,故每个学生的帐号中已事先由信息中心为大家建立了一个名为帐号名的数据库.但我们必须了解创建数据库的语句为CREATE DATABASE <数据库名>2.数据表:是构成数据库的一个基本单位,在一个数据库中用户可以建立多张数据表.这是我们有权力建立的.3.数据表结构:创建一个数据表的第一步即为创建数据表结构,在数据表结构中的内容包括:有几个字段,每个字