`
longflang
  • 浏览: 65632 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SQL 语句调优_SQL传递参数的数据类型与表索引字段类型保持一致

阅读更多

SQL 语句调优_SQL传递参数的数据类型与表索引字段类型保持一致

 

今天在一个生产数据库上发现了一个TOP SQLSQL本身很简单,但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将自动进行数据类型转换,这时就不会使用到索引,而是使用全表扫描,从而导致了CPUI/O都开销很大。笔者已经遇到了多次这样的问题,今天写出来,希望对大家有所帮助。

 

 

转自:http://space.itpub.net/32980/viewspace-676870

分享到:
评论

相关推荐

    DB2 SQL性能调优秘笈

    2. **覆盖索引**:如果查询只需要返回索引中的字段,则创建一个覆盖索引可以避免额外的数据访问操作,从而提升性能。 3. **定期维护索引**:定期更新统计信息并重建索引可以确保它们始终处于最佳状态。 #### 三、...

    数据库性能调优常用SQL语句

    此外,定期检查并清理无用的数据、维护索引、合理设计数据库表结构和数据类型,以及根据业务特点选择合适的数据存储引擎(如InnoDB、MyISAM),都是数据库性能优化的重要组成部分。 总的来说,数据库性能调优需要...

    SQL.Tuning.rar_sql_调优

    1. **查询优化**:编写高效的SQL语句是调优的基础。避免全表扫描,合理使用索引,以及适当的JOIN操作,都是优化查询的关键。例如,应尽量避免在JOIN条件或WHERE子句中使用非索引字段,以减少查询时间。 2. **索引...

    SQL语句查询数据表主键和所有字段

    在数据库管理中,了解如何通过SQL语句查询数据表的主键和所有字段是一项基本而重要的技能。这不仅有助于数据库管理员或开发人员更好地理解数据库结构,还能在进行数据操作、优化查询性能或解决数据完整性问题时提供...

    使用SQL语句增加字段

    例如,假设我们有一个名为`Employees`的表,现在想要添加一个名为`Salary`的新字段,数据类型为`Currency`,则SQL语句如下: ```sql ALTER TABLE Employees ADD COLUMN Salary Currency; ``` 这条语句执行后,...

    关于oracle clob 类型字段重建索引SQL及修复用户表空间索引空间的存储过程

    以下是一个简单的重建CLOB类型字段索引的SQL语句示例: ```sql BEGIN EXECUTE IMMEDIATE 'DROP INDEX your_clob_index_name'; EXCEPTION WHEN OTHERS THEN IF SQLCODE != -942 THEN RAISE; END IF; END; / ...

    用SQL语句表与字段的基本操作、数据库备份等

    这将在`docdsp`表中添加一个名为`dspcode`的新字段,其数据类型为`CHAR(200)`。 2. **删除字段**: 删除字段同样使用`ALTER TABLE`语句,配合`DROP COLUMN`子句: ```sql ALTER TABLE table_NAME DROP COLUMN ...

    SQLServer索引调优实践

    ### SQL Server索引调优实践 #### 索引的重要性 在数据库性能优化的过程中,索引扮演着极其重要的角色。不恰当的索引使用会导致其他优化措施的效果大打折扣,甚至变得毫无意义。因此,了解如何正确地创建、管理和...

    数据库 创建索引 sql oracle

    * 聚集索引:将表中的记录在物理数据页中的位置按索引字段值重新排序,再将重排后的结果写回到磁盘上。每个表只能有一个聚集索引。 * 非聚集索引:与表中数据行的实际存储结构无关,不会改变数据表中记录的实际存储...

    泛微系统SQL语句大全

    通过合理设计表结构(如选择合适的数据类型、主键和外键)、创建和使用索引、调整查询语句,可以显著提升SQL Server的运行效率。 7. **安全性与权限管理**: - SQL Server提供了一套完整的权限管理系统,包括用户...

    SQL调优与案例分享

    2. **兼容数据类型**:确保所有参与比较或运算的数据类型一致,避免类型转换带来的性能损失。 - **示例**:如果`col3`是`money`类型,则在`WHERE col3 > 60000`这样的查询中,应将`60000`转换为`money`类型。 3. *...

    最全的SQL语句大全_学完就是SQL操作能手

    1. **SQL基础**:这是SQL学习的起点,包括数据类型(如整数、字符串、日期/时间)、创建数据库与表、插入数据以及查询数据。例如,`CREATE DATABASE myDB`用来创建数据库,`CREATE TABLE students (id INT, name ...

    Effective MySQL之SQL语句最优化.pdf

    例如,使用合适的字段类型、避免使用过大的数据类型、将经常一起查询的字段放在同一张表中等。 8. 数据存储方式优化:数据的存储方式也会影响查询性能,例如,通过分区可以将数据分散到不同的存储区域,根据业务...

    SQL 语句书写与性能调优规范

    总的来说,SQL语句的性能调优是一个涉及多方面的过程,包括但不限于选择正确的查询结构、优化表连接顺序、使用索引、避免全表扫描以及合理使用数据库提供的特性。遵循这些规范和最佳实践,开发者能够编写出更加高效...

    SQL_Server_2008_R2_监视与调优解决方案.pdf

    本文将详细介绍SQL Server 2008 R2 的监视与调优解决方案,包括性能调优的方法学、架构设计、查询优化、索引优化、并发控制、存储优化以及服务器优化等方面。 #### 二、性能调优的方法学 ##### 调优顺序 - **最...

    sql_init.zip_SQL INIT_dinnerlcl_sql init_sql:init_sql:init()

    标签中的“sql:init”和“sql:init()”可能表示的是在SQL语句或者数据库管理脚本中定义的初始化过程或函数。 压缩包内的文件“sql_init.sql”是实际的SQL脚本文件,包含了执行数据库初始化所需的所有SQL命令。这些...

    SQL语句的优化与性能调优.pdf

    SQL语句优化与性能调优是数据库管理和维护的关键环节,其重要性在数据量日益庞大的今天愈发凸显。首先,文章提到糟糕的SQL语句是导致系统性能低下的主要原因之一,这些问题包括大小写不统一、SQL语句的书写差异等。...

    sql.rar_SQL语句

    SQL的基础概念包括数据类型(如INT、VARCHAR、DATE)、表的创建与删除(CREATE TABLE, DROP TABLE)、数据的插入(INSERT INTO)、查询(SELECT)以及更新(UPDATE)和删除(DELETE)。 2. **SQL查询** SELECT...

    SQL查询字段被包含语句

    如果要添加新的名字,只需更新传入的参数即可,无需改动SQL语句,从而简化了代码维护。 需要注意的是,虽然`CHARINDEX`在处理多个关键词时提供了便利,但它在大数据量查询时可能不如其他优化过的查询方法(如全文...

Global site tag (gtag.js) - Google Analytics