`
LeeYee
  • 浏览: 72139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

表索引字段嵌套函数引起的性能问题

    博客分类:
  • SQL
 
阅读更多

先看这句SQL


SELECT agentalias, COUNT (DISTINCT (callin))
FROM (SELECT agentalias, ani callin
FROM table_a
WHERE TO_DATE (starttime, 'yyyymmddhh24miss') BETWEEN TRUNC
(SYSDATE)
AND SYSDATE
AND connectlength > 0
AND agentalias = '4003'
UNION ALL
SELECT agentalias, connectno callout
FROM table_b
WHERE TO_DATE (starttime, 'yyyymmddhh24miss') BETWEEN TRUNC
(SYSDATE)
AND SYSDATE
AND connectlength > 0
AND LENGTH (TRIM (connectno)) > 5
AND agentalias = '4003')
GROUP BY agentalias


再看同样功能的SQL


SELECT agentalias, COUNT (DISTINCT (callin))
FROM (SELECT agentalias, ani callin
FROM table_a
WHERE starttime BETWEEN TO_CHAR (TRUNC (SYSDATE), 'yyyymmdd')
AND TO_CHAR (SYSDATE, 'yyyymmddhh24miss')
AND connectlength > 0
AND agentalias = '4003'
UNION ALL
SELECT agentalias, connectno callout
FROM table_b
WHERE starttime BETWEEN TO_CHAR (TRUNC (SYSDATE), 'yyyymmdd')
AND TO_CHAR (SYSDATE, 'yyyymmddhh24miss')
AND connectlength > 0
AND LENGTH (TRIM (connectno)) > 5
AND agentalias = '4003')
GROUP BY agentalias


table_a、table_b 表中 starttime 都是 index


执行结果中,第一个SQL很慢,查看查询计划走的是全表扫描,第二个SQL很快,因为走的索引

 

结论:通过SQL比较,发现在当在查询字段starttime,亦即index字段上加上函数后就会出现不走index而走全表扫描的情况。这里是不是可以得出如果在当index字段作为搜索条件时,如果在index上使用了函数那么该index将不会起到作用?

分享到:
评论

相关推荐

    DB2性能安全文件

    **修复分区表问题:** 如果发现分区表有问题,可以尝试使用`REBUILD PARTITION`命令来修复。 #### 二十二、为什么ODS大部分情况下,使用表的锁(LOCK)为“表级”? 表级锁可以减少并发冲突,适用于读多写少的场景...

    SQL编写及其优化培训.doc

    1. **3.3.1 防止过滤字段中套用函数**:如果WHERE子句中的列使用了函数,那么即使该列有索引也无法利用,因为索引无法理解函数的结果。如果必须使用函数,可以考虑创建函数索引来优化。 2. **3.3.2 防止把列放入...

    mysql军规-sql规范

    - **解释**:事务时间越长,占用资源越多,可能引起死锁等问题。 - **建议**:缩短事务处理时间,尽量减少锁定时间。 **3. 避免使用触发器,用户自定义函数,请由程序取而代之** - **解释**:触发器和用户自定义...

    oracle语句优化

    - **避免在WHERE子句中使用否定条件和函数**:这可能导致无法使用索引,增加查询复杂性。 2. **表设计优化**: - **分区表**:对于大型表,可以使用范围、列表或哈希分区来分散I/O,提高查询性能。 - **物理存储...

    全国计算机三级数据库考试试题(七).docx

    - **嵌套表**:为了支持对象中的某些属性也是对象的情况,Oracle 引入了嵌套表的概念。嵌套表允许在一个表中存储其他表的行,从而实现了更复杂的对象关系映射。 - **抽象数据类型**:虽然 Oracle 支持创建抽象数据...

    2009达内SQL学习笔记

    当两个表有相同字段时必须加前缀,列名前需加表名和“.”,如“s_emp.id”。 1、用法:SELECT columns,prod2,prod3<列> FROM Table1,table2<表名> 分号结束 如: select id from s_emp; select last_name,name ...

    sql语句优化之SQL Server(详细整理)

    避免全表扫描,利用索引,合理使用事务(如避免在动态SQL中嵌套事务),以及利用存储过程和参数化查询来提高性能。 10. **监控和分析**:使用`sp_lock`和`sp_who`等系统存储过程监控系统资源的竞争情况,及时发现和...

    mysql的使用心得

    - MySQL 5.0.3至5.0.5版本间,InnoDB和MyISAM表中以空格结尾的TEXT字段索引顺序发生改变。 - **解决方案** - 执行`CHECK TABLE`、`OPTIMIZE TABLE`或`REPAIR TABLE`命令进行修复。 通过以上总结,我们可以看到...

    2021-2022计算机二级等级考试试题及答案No.19331.docx

    相比之下,“主”索引和“有(无重复)”索引要求索引字段的值必须是唯一的。 #### VFP中子类或表单的创建 - **知识点**: 在VFP中创建子类或表单时,不能新建“事件”。 - **详细解释**: Visual FoxPro(VFP)是一种...

    超详细Oracle教程

    2. 数据库基础:介绍了数据库的基本概念,包括数据库、数据表、字段等基础知识点,以及数据库管理系统的作用。 3. Oracle入门:包括Oracle的安装、配置、基本操作,以及数据库的创建、管理等入门级内容。 4. 查询...

    2021-2022计算机二级等级考试试题及答案No.11117.docx

    22. **子查询**:子查询可以嵌套在其他查询中,如在SQL SELECT语句中定义新字段或作为筛选条件。 23. **CPU制造商**:Intel并非唯一CPU制造商,还有AMD等公司。 24. **计算机硬件核心**:CPU是微型计算机的核心,...

    mysql数据库考试题

    7. **乱码问题**:通常由于字符集设置不当引起,需要检查数据库、表和字段的字符集设置,确保它们与输入数据一致。 8. **MySQL服务启动问题**:在Windows系统中,可以通过服务管理器、命令行(如`net start mysql`...

    MSDN类库开发人员设计指南

    - **在集合中使用索引属性**:在某些情况下,可以在集合中使用索引属性来代替传统的数组索引访问方式。 - **数组值属性**:数组值属性是指数组中每个元素的值。 - **返回空数组**:当需要返回一个空数组时,应确保...

    Oracle9i的init.ora参数中文说明

    说明: 确定查询是否获取表级的读取锁, 以防止在包含该查询的事务处理被提交之前更新任何对象读取。这种操作模式提供可重复的读取, 并确保在同一事务处理种对相同数据的两次查询看到的是相同的值。 值范围: TRUE | ...

    Java面试宝典

    - 抽象类可以包含构造函数、方法实现和字段,而接口只能包含抽象方法和常量。 - 类可以实现多个接口,但只能继承一个抽象类。 - 抽象类中的方法可以是抽象的也可以是非抽象的,而接口中的方法默认都是抽象的。 **...

    java最新面试文档

    - **抽象类**(abstract class)可以有构造函数、实例方法和抽象方法,还可以包含字段。 - **接口**(interface)中所有的方法都是抽象的,Java 8之后可以包含默认方法和静态方法。 #### 25. abstract方法与修饰符 ...

Global site tag (gtag.js) - Google Analytics