我的编程空间,编程开发者的网络收藏夹
学习永远不晚

oracle 实现基于函数的索引

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

oracle 实现基于函数的索引

使用场景:
当一个查询运行很慢。通过检查where子句,发现其中的一列应用了sql lower函数,lower函数
阻止使用该列上现有的索引。你想要创建一个基于函数索引来支持这个查询,如下

SQL> select index_name,column_name from user_ind_columns where table_name='T1';

INDEX_NAME                COLUMN_NAME
------------------------- ------------------------------
T1_PK                     OBJECT_ID

SQL> set autotrace trace explain;
SQL> select * from t1 where lower(object_name)='i_undo1';

执行计划
----------------------------------------------------------
Plan hash value: 3617692013

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |   908 |   101K|   436   (1)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T1   |   908 |   101K|   436   (1)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(LOWER("OBJECT_NAME")='i_undo1')
从以上可以看出即使该表中有索引也没有使用。

解决方案
1、创建一个基于函数的索引
2、如果使用oracle database 11g或更高版本,创建一个索引虚拟列

下面实现基于函数的索引

创建索引可以通过以下方式来估计索引所使用空间以及所需要分配的空间

SQL> set serveroutput on
SQL> var used_bytes number;
SQL> var allo_bytes number;
SQL> exec dbms_space.create_index_cost('create index t1_object_name on t1(lower(object_name))',:used_bytes,:allo_bytes);
 
PL/SQL procedure successfully completed
used_bytes
---------
2269350
allo_bytes
---------
4194304

SQL>create index idx_lower on t1(lower(object_name)) tablespace index_nocompress;

SQL> select * from t1 where lower(object_name)='i_undo1';

执行计划
----------------------------------------------------------
Plan hash value: 2274688371

-------------------------------------------------------------------------------------------------
| Id  | Operation                           | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |           |   908 |   101K|   193   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| T1        |   908 |   101K|   193   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | IDX_LOWER |   363 |       |     3   (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(LOWER("OBJECT_NAME")='i_undo1')

注意:不能直接修改一个创建了基于函数索引的列。需要先删除索引,然后修改列,最后再重建索引。不然会报ora-30556错误(在要修改的列上已定义函数索引或位图联接索引)

查看基于函数的索引定义dba/all/user_ind_expressions

SQL> select index_name,column_expression from user_ind_expressions;

INDEX_NAME                COLUMN_EXPRESSION
------------------------- --------------------------------------------------
IDX_LOWER                 LOWER("OBJECT_NAME")

接着实现在虚拟列创建一个索引

使用场景

现在正使用一个基于函数的索引,但想要获得更好的性能,想将基于函数的索引替换为一个虚拟列,然后在虚拟列上创建索引(需要11g环境或更高版本)。

SQL>alter table t1 add(lower_object_name generated always as (lower(object_name)) virtual);
SQL>create index idx_lower on t1(lower_object_name) tablespace index_nocompress;


 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

oracle 实现基于函数的索引

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP实现基于文本的简易搜索引擎功能

本文详细介绍了如何使用PHP构建基于文本的简易搜索引擎,包括文档索引、文本预处理、倒排索引、搜索功能、排名优化等步骤,并提供了PHP代码示例。此搜索引擎易于实现、可定制且低成本,适用于查找和检索文本数据。
PHP实现基于文本的简易搜索引擎功能
2024-04-02

Numpy 数组索引的实现

本文主要介绍了Numpy 数组索引的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-28

python基于搜索引擎如何实现文章查重功能

这篇文章给大家分享的是有关python基于搜索引擎如何实现文章查重功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫
2023-06-14

oracle函数索引失效的原因有哪些

数据分布不均匀:如果函数索引的参数值分布不均匀,可能会导致索引失效。比如,如果函数返回的值只有很少几个离散值,那么索引的选择性会很低,导致索引失效。函数运算代价高:如果函数的计算代价很高,可能会导致索引失效。数据库优化器在选择执行计划时会考
oracle函数索引失效的原因有哪些
2024-04-09

数据库中索引的实现原理:B-tree索引

数据库会使用一些方式来存储、读取和修改数据,在实际的数据库管理中,数据库会同时使用B-tree和B+tree来存储数据。其中B-tree用于索引,B+tree用于存储实际记录。本文带来B-tree在数据库中的索引机制。B-tree即B树,它
数据库中索引的实现原理:B-tree索引
2024-01-22

Index函数与Oracle数据库的索引合并优化

Index函数是Python中用于查找元素在列表中的索引位置的函数。而Oracle数据库中的索引是用来加快数据库表的查询速度的数据结构。在合并优化时,可以通过合理使用索引来提高查询效率。在Python中,如果需要频繁查找某个元素在列表中的
Index函数与Oracle数据库的索引合并优化
2024-08-15

Index函数与Oracle数据库的索引监控工具

Index函数是一种用于创建索引的函数,可以帮助提高数据库查询效率。在Oracle数据库中,索引监控工具可以帮助用户监控索引的性能和健康状态,从而优化数据库性能。这些工具通常提供了索引的统计信息、使用情况、碎片化情况等信息,帮助用户及时发现
Index函数与Oracle数据库的索引监控工具
2024-08-15

Index函数与Oracle数据库的索引排序优化

Index函数是用于创建索引的函数,它可以帮助数据库系统快速定位数据,提高查询性能。在Oracle数据库中,索引在数据查询中起着至关重要的作用。对于索引排序的优化,以下是一些建议:使用合适的索引类型:在创建索引时,根据查询需求选择合适的索引
Index函数与Oracle数据库的索引排序优化
2024-08-15

Oracle Index函数与数据库的索引自动优化

Oracle Index函数是用来创建、修改、删除索引的函数,它可以帮助数据库管理员在数据库中更有效地管理索引。索引是数据库中一种用于加快数据查询速度的数据结构,通过索引可以快速定位到数据记录,从而提高查询效率。索引优化是数据库性能优化的
Oracle Index函数与数据库的索引自动优化
2024-08-15

Oracle Index函数与数据库的索引维护工具

Oracle Index函数是一种用于创建和管理数据库索引的工具。它允许用户在数据库表上创建索引,以提高查询性能和加快数据检索速度。通过使用Index函数,用户可以选择在表的一个或多个列上创建索引,并对索引进行优化和维护。索引维护工具是一
Oracle Index函数与数据库的索引维护工具
2024-08-15

Oracle Index函数与数据库的索引选择算法

Oracle Index函数是一个用于创建和管理数据库索引的函数。它可以帮助数据库管理员在数据库中创建索引,以提高查询性能和加速数据访问。Oracle Index函数包括各种类型的索引,如B树索引、位图索引、哈希索引等。数据库索引选择算法
Oracle Index函数与数据库的索引选择算法
2024-08-15

Index函数与Oracle数据库的索引分区策略

Index函数是用来创建索引的函数,可以用来提高数据库查询的性能。在Oracle数据库中,索引分区策略是一种将索引分割成多个部分存储在不同的表空间中的技术。这种技术可以帮助提高查询性能和管理索引的效率。在Oracle数据库中,可以使用分区
Index函数与Oracle数据库的索引分区策略
2024-08-14

oracle函数索引的优点和缺点是什么

Oracle函数索引的优点:提高查询性能:函数索引可以帮助加快查询速度,特别是在使用函数进行数据筛选或排序时。提高数据的可用性:函数索引可以帮助提高数据的可用性,减少数据查询或处理时的延迟时间。支持多种函数:Oracle函数索引支持多种函数
oracle函数索引的优点和缺点是什么
2024-04-09

编程热搜

目录