SQL 语句调优_SQL传递参数的数据类型与表索引字段类型保持一致
今天在一个生产数据库上发现了一个TOP SQL,SQL本身很简单,但COST非常大(执行计划走了全表扫描),SQL语句如下:
SELECT D.FIELD_VALUE, D.FIELD_VALUE_CLOB FROM RUNLOG_RUN_REC_DETAIL D WHERE D.RUN_RECORD_ID =:B2 AND D.FIELD_NUMBER=:B1
这个表在字段"RUN_RECORD_ID"上建立了索引,但为什么没有使用到索引呢?
一. 原因
传递参数时,类型与数据库表的字段类型不同(表字段类型为字符型),这样就会产生数据类型转换,ORACLE无法使用到索引,走了TABLE ACCESS FULL,导致get buffer过多,cpu cost也过多:
Object Type TABLE
Order 1
Rows 1
Size (KB) 0.052
Cost 7,328
Time 88
CPU Cost 804,127,446
I/O Cost 7,286
二. 解决方法
1. 修改SQL 语句,建议:
SELECT D.FIELD_VALUE, D.FIELD_VALUE_CLOB FROM PROD_RUNLOG_RUN_REC_DETAIL D WHERE TO_NUMBER(D.RUN_RECORD_ID) =:B2 AND D.FIELD_NUMBER=:B1 ;
2. 修改传递参数的类型为字符型
:B2='2007' 而不是 :B2=2007
SELECT D.FIELD_VALUE, D.FIELD_VALUE_CLOB FROM PROD_RUNLOG_RUN_REC_DETAIL D WHERE TO_NUMBER(D.RUN_RECORD_ID) =:B2 AND D.FIELD_NUMBER=:B1 ;
3. 修改该表的其中一个索引(推荐)
DROP INDEX SCDC.RUN_RECORD_ID;
CREATE INDEX SCDC.RUN_RECORD_ID ON TABLE SCDC.PROD_RUNLOG_RUN_REC_DETAIL(TO_NUMBER(RUN_RECORD_ID),FIELD_NUMBER);
三.结论
当SQL传递参数与表索引字段类型不一致的时候,ORACLE将自动进行数据类型转换,这时就不会使用到索引,而是使用全表扫描,从而导致了CPU和I/O都开销很大。笔者已经遇到了多次这样的问题,今天写出来,希望对大家有所帮助。
转自:http://space.itpub.net/32980/viewspace-676870
分享到:
相关推荐
达梦数据库_SQL语言手册.pdf 数据库快照定义语句 数据库快照删除语句 第章数据查询语句和全文检索语句 单表查询 简单查询 带条件查询 集函数 情况表达式 连接查询 子查询 标量子查询 表子查询 派生表子...
因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引) 14、说明:前10条记录 select top 10 * form table...
1.创建一个表person,包括字段有姓名、性别、出生日期、工作和家庭地址。 2.为表person增加email列,观察是否增加了email列;然后删除email列。 3.基于person表创建简单视图,并在姓名列创建索引。 4.为person表增加...
第一部分、 基础 1、创建数据库 ...14:查询某一个表的字段和数据类型 15:不同服务器数据库之间的数据操作 SQL Server基本函数 SQLServer2000同步复制技术实现步骤 一、 预备工作 二、 正式配置
3.5 参数类型与字段类型不匹配,导致类型发生了隐式转换,索引失效 3.6 查询条件使用or关键字,其中一个字段没有创建索引,则会导致整个查询语句索引失效; or两边为“>”和“<”范围查询时,索引失效 3.7 两列数据...
如在文章内容字段里用lik e 语句搜索一个关键字, 当数据表里的内容很多时,这个时间可能会让人难以忍受。 在SQL Server 中提供了一种名为全文索引的技术,可以大大提高从长字符串里搜索数 据的速度,在本章里,将会...
2.5-删除索引 (含对应的sql语句) 3-修改排序规则 (含对应的sql语句) 4-生成主鍵 (含对应的sql语句) 5-生成外鍵 (含对应的sql语句) 6-生成索引 (含对应的sql语句) 7-执行对应的sql语句及导出 或 不...
对于满足以上条件的这些表,必须重点关注,因为在这些表上的索引,将对SQL语句的性能产生举足轻重的影响。不过下面还是总结了一下降龙十八掌内功的入门基础,建立索引常用的规则如下: 1、表的主键、外键必须有索引...
主要介绍了MySQL常用的建表、添加字段、修改字段、添加索引SQL语句写法,总结分析了MySQL建表、编码设置、字段添加、索引操作所涉及的SQL语句,需要的朋友可以参考下
了表,或少了字段,或字段类型长度不一样,或索引 不一样, 或存储过程,视图,触发器,默认值等不一样,就产生 相应的S QL语句! 二.操作方法: 先把源数据库的连接属性(数据库名,服务器名, 用户名, 密码)填好,按读源数据,...
14、利用T-SQL语句修改表 ? 15、利用T-SQL语句插入记录 ? 16、设置字段是否允许Null ? 17、利用Update语句更新表中记录 ? 18、利用Update语句更新表中记录2 ? 18、利用Update语句更新表中记录3 ? 19、利用...
3、 在table1数据表中增加“No_id”字段,数据类型char(12),不可空,并将其设定为UNIQUE约束,写出其命令语句。 六、 编程填空题:(10分) 填写出下列触发器中缺少的要害字,使下面语句完整: if update(...
1.5.1 SQL环境介绍 1.5.2 SQL的层次结构 1.5.3 SQL环境中的对象 1.5.4 SQL环境中的程序系统 1.6 SQL语句基础 1.6.1 SQL常量 1.6.2 SQL表达式 1.6.3 SQL数据类型 1.6.4 注释符 1.6.5 批处理 1.6.6 SQL语句的执行 ...
经典SQL语句大全 下列语句部分是Mssql语句,不可以在access中使用。 SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT) DCL—数据控制...
2.2 通过SQL语句管理数据表 2.2.1 创建数据表 2.2.2 定义非空约束 2.2.3 定义默认值 2.2.4 定义主键 2.2.5 定义外键 2.2.6 修改已有数据表 2.2.7 删除数据表 2.2.8 受限操作的变通解决方案 第3章 ...
2.2 通过SQL语句管理数据表 2.2.1 创建数据表 2.2.2 定义非空约束 2.2.3 定义默认值 2.2.4 定义主键 2.2.5 定义外键 2.2.6 修改已有数据表 2.2.7 删除数据表 2.2.8 受限操作的变通解决方案 第3章 ...
本语句包括了表、字段、字段类型、字段长度、是否为空、是否递增字段、索引名称、索引的定位、索引类型、主键、 外键等;通过合理的裁剪可以很方便的生成相应的数据字典。
ACCESS中使用SQL语句应注意的地方及几点技巧 Create Unique Index iName ON Tab1 (Name); 完成后ACCESS中字段Name索引属性显示为 - 有(无重复). 下面的语句删除刚才建立的两个索引 Drop Index iDate ...
本Word文档旨在提供关于建表规范、SQL规范以及索引规范的详细指导,帮助数据库管理员和开发人员更有效地进行数据库设计、SQL语句编写以及索引优化,提升数据库的性能和可维护性。 二、建表规范 表名规范:表名应...