近期在使用时间查询的时候,因为在日期字段上要使用函数转换,无法建立索引。
因此只好建立函数索引来完成。
环境如下:
select count(*) as TJ, FAULT_TYPE, decode(FAULT_STYLE, null, 0, fault_style) fault_style
FROM RM_MALFUNCTION_FAULT
WHERE to_char(notice_date, 'yyyy-mm') = to_char(sysdate, 'yyyy-mm')
group by fault_type, fault_style
虽然在notice_date上建立了索引,但是因为使用函数转换,无法使用索引,还是全表扫描。
最后只好在此字段上建立函数索引: to_char(notice_date,'yyyy-mm')
要使用函数索引,必须条件:
(1)
必须拥有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其他模式下)权限。
(2)
必须使用基于成本的优化器,基于规则的优化器将被忽略。
(3)
必须设置以下两个系统参数:
1.QUERY_REWRITE_ENABLED=TRUE
2.QUERY_REWRITE_INTEGRITY=TRUSTED
可以通过alter system set,alter session set在系统级或线程级设置,也可以通过在init.ora添加实现。
基于函数的索引,类似于普通的索引,只是普通的索引是建立在列上,而它是建立在函数上。当然这回对插入数据有一定影响,因为需要通过函数计算一下,然后生成索引。但是插入数据一般都是少量插入,而查询数据一般数据量比较大。为了优化查询速度,稍微降低点插入速度是可以承担的。
建立函数索引后,上述SQL,执行起来效率非常不错。
函数索引还有一个功能,只对部分行建立索引。假设有一个很大的表,有一列叫做FLAG,只可能取Y和N。假设大部分数据是Y,小部分数据是N,我们需要将N修改成Y。如果建立一个普通索引,这个索引会非常大,而且将N修改成Y的时候,维护这个索引开销会很大。不过这个表听起来比较适合位图索引,但这是一个事物系统(OLTP),可能有很多人同时插入记录,或者进行修改。那么位图索引也不适合。所以,如果我们只是在值为N的行上建立索引,就比较好办了。
只在值为N的行建立索引SQL:create index flag_index on big_table(case flag when 'N' then 'N' end);这样一个索引大小会大大降低,而且维护成本也会很低的。前提是我们只对值为N的行感兴趣。
分享到:
相关推荐
函数索引允许在列上应用函数后再创建索引,如对日期字段进行年份提取后建索引。唯一索引则确保索引列中的每个值都是唯一的,有助于维护数据的完整性。 创建索引有多种方式,如通过CREATE INDEX语句直接创建,或在...
#### 二、创建与使用函数索引 ##### 1. 创建函数索引 示例中通过`CREATE INDEX`语句创建了一个针对`surname`字段经过`UPPER()`函数处理后的函数索引`fbionsale_contacts`。该索引基于`UPPER(surname)`这个表达式,...
Oracle支持多种类型的索引,包括B树索引、位图索引、函数索引和唯一索引等。其中,B树索引是最常见的一种,它通过分层结构快速定位数据行。位图索引则适合于低基数(即某个字段值较少)的列,通过位图方式存储,节省...
5. **序列对象**:Oracle中的序列在PostgreSQL中可以通过创建序列类型来模拟,orafce提供了类似于Oracle的序列操作函数。 6. **其他兼容性特性**:还包括异常处理、游标处理、包的创建等,以尽可能地模拟Oracle的...
Oracle支持多种类型的索引,主要包括B树索引、位图索引、函数索引等。其中,B树索引是最常用的索引类型,它能够提供高效的插入、删除以及查找操作。本篇主要介绍B树索引的创建与管理。 #### 三、B树索引结构详解 B...
1. 创建索引:使用CREATE INDEX语句创建全文索引,指定索引类型(如CTX),并提供包含文本数据的列名。 2. 分析索引:创建索引后,使用DBMS_INDEXAnalyzer进行分析,以优化索引性能。 三、全文检索语法 1. 使用...
Oracle 索引的建立、修改、删除 Oracle 索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。...对反向键索引的使用需要根据实际情况进行选择,避免不必要的索引建立和维护。
- **函数索引(Function-Based Index)**: 允许基于函数的结果创建索引,使得对函数结果的查询能利用索引。 - **唯一索引(Unique Index)**: 确保索引键的唯一性,与唯一约束相似,但不强制非空。 - **分区索引...
首先,索引分为几种主要类型,包括B树索引、位图索引、函数索引和全局唯一索引等。B树索引是最常见的一种,其内部结构由根块、分支块和叶子块组成。在提供的内容中,我们看到了类似B树结构的分布模式,这可能是在...
通过以上示例,我们学习了Oracle数据库中索引的基本使用方法以及一些高级特性,如分区表索引、唯一索引、函数索引等。此外,还了解了如何通过实际的数据操作来测试索引的性能效果。这些知识点对于深入理解和掌握...
- Function-Based索引:基于函数的结果创建索引,索引列是函数的输出。 - Reverse索引:反向键索引,用于存储数据的反向副本,提高某些查询性能。 - Unique索引:确保列中的值是唯一的。 - Index-Organized ...
函数索引是Oracle 8i以来的创新,它允许在索引中存储基于列值计算的结果,而不是直接的列值。这种索引特别适用于包含复杂函数表达式的查询条件,如`WHERE function(column) = value`。通过预先计算并存储计算结果,...
总之,Oracle的索引学习涵盖了从索引创建、选择合适的索引类型、理解数据操作对索引的影响,到使用Autotrace和DBMS_XPLAN进行性能分析等多个方面。深入理解和实践这些知识点,能帮助我们更好地管理和优化Oracle...
3. **函数操作**: 如果在索引列上使用了函数,比如`SELECT * FROM t WHERE lower(column) = 'value'`,Oracle将不会使用索引,除非你为该函数创建了函数索引。这是因为函数操作改变了原始列的值,使得索引无法直接...
函数索引允许对列应用函数后再创建索引,使得查询可以使用函数结果进行查找。 了解索引的基本概念后,我们关注组合索引。组合索引是由多个列组成的索引,它可以提供更灵活的查询优化。在Oracle9i之前,只有当查询...
2. **创建Oracle函数返回索引表**: 在PL/SQL中,你可以定义一个函数,使其返回上述索引表类型。下面的`funtry_ret_index`函数创建了一个`sqlindext`类型的实例`array`,并填充了一些值,然后将其返回。 ```sql ...
- **索引优化**:在某些场景下,使用CRC32值作为索引可以帮助优化查询性能。 #### 五、注意事项 1. **兼容性**:确保使用的Oracle版本支持Java存储过程。 2. **安全性**:在使用Java函数时,需要注意SQL注入等安全...
**一、Oracle函数大全** Oracle数据库提供了丰富的内置函数,用于处理各种数据类型和计算任务。以下是一些常见的函数类别: 1. **算术函数**:如`ADD_MONTHS()`用于增加月份,`ROUND()`用于四舍五入数值。 2. **...
例如,通过分析`DBA_TABLES`和`DBA_INDEXES`,可以找出没有使用索引的高访问量表,从而考虑是否需要创建索引以提高查询速度。 总的来说,Oracle函数列表和数据字典是Oracle数据库管理的两大关键工具。掌握它们,...