返回顶部
首页 > 资讯 > 数据库 >oracle 实现基于函数的索引
  • 411
分享到

oracle 实现基于函数的索引

2024-04-02 19:04:59 411人浏览 独家记忆
摘要

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

使用场景:
当一个查询运行很慢。通过检查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;


 

 

您可能感兴趣的文档:

--结束END--

本文标题: oracle 实现基于函数的索引

本文链接: https://lsjlt.com/news/36562.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • oracle 实现基于函数的索引
    使用场景:当一个查询运行很慢。通过检查where子句,发现其中的一列应用了sql lower函数,lower函数阻止使用该列上现有的索引。你想要创建一个基于函数索引来支持这个查询,如下SQL>...
    99+
    2024-04-02
  • 基于函数的索引
    以下内容摘自《Oracle SQL 高级编程》 第12.4.2章节-基于函数的索引[其中代码部分被修改,原始请参考书籍]如果一个谓语在索引列上应用了函数,则优化器不会选用该列上的索引。例如,对于谓...
    99+
    2024-04-02
  • MySQL基于索引的压力测试的实现
    一、模拟数据库数据 1-1 创建数据库及表脚本 - vim slap.sh #!/bin/bash HOSTNAME="localhost" PORT=...
    99+
    2024-04-02
  • 基于 Mysql 实现一个简易版搜索引擎
    目录基于 Mysql 实现一个搜索引擎一、ngram 全文解析器二、创建全文索引1、建表时创建全文索引2、通过 alter table 方式3、通过 create index 方式三...
    99+
    2024-04-02
  • python基于搜索引擎实现文章查重功能
    前言 文章抄袭在互联网中普遍存在,很多博主都收受其烦。近几年随着互联网的发展,抄袭等不道德行为在互联网上愈演愈烈,甚至复制、黏贴后发布标原创屡见不鲜,部分抄袭后的文章甚至标记了一些联...
    99+
    2024-04-02
  • 基于java中cas实现的探索
    目录1.背景简介2. java源码追踪3. hotspot jvm源码追踪4. 手写一个cas实现1. 通过汇编手写一个cas方法2. 多线程条件下测试自行实现的cas方法3. ca...
    99+
    2024-04-02
  • Numpy 数组索引的实现
    目录一、整数索引二、切片索引2.1、一维数组切片2.2、多维数组切片三、整数数组索引3.1、 一维数组的整数数组索引3.2、多维数组的整数数组索引四、布尔索引五、花式索引数组索引是指...
    99+
    2023-01-28
    Numpy 数组索引
  • 基于Java的全文索引引擎Lucene是怎样的
    今天给大家介绍一下基于Java的全文索引引擎Lucene是怎样的。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。基于Java的全文索引引擎LuceneLucen...
    99+
    2023-06-03
  • oracle函数索引失效的原因有哪些
    数据分布不均匀:如果函数索引的参数值分布不均匀,可能会导致索引失效。比如,如果函数返回的值只有很少几个离散值,那么索引的选择性会...
    99+
    2024-04-09
    oracle
  • python基于搜索引擎如何实现文章查重功能
    这篇文章给大家分享的是有关python基于搜索引擎如何实现文章查重功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫...
    99+
    2023-06-14
  • 数据库中索引的实现原理:B-tree索引
    数据库会使用一些方式来存储、读取和修改数据,在实际的数据库管理中,数据库会同时使用B-tree和B+tree来存储数据。其中B-tree用于索引,B+tree用于存储实际记录。本文带来B-tree在数据库中的索引机制。 B-t...
    99+
    2024-01-22
    B树的概念
  • Oracle函数使索引列失效怎么办
    小编给大家分享一下Oracle函数使索引列失效怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、数据版本与原始语句及相关信息版本信息SQL> select * from&...
    99+
    2023-06-22
  • oracle函数索引怎么创建和使用
    创建一个Oracle函数索引的语法如下: CREATE INDEX index_name ON table_name (functi...
    99+
    2024-03-13
    oracle
  • Oracle函数使索引列失效的解决办法
    在索引列上使用函数使得索引失效的是常见的索引失效原因之一,因此尽可能的避免在索引列上使用函数。尽管可以使用基于函数的索引来解决索引失效的问题,但如此一来带来的比如磁盘空间的占用以及列...
    99+
    2024-04-02
  • oracle函数索引的优点和缺点是什么
    Oracle函数索引的优点: 提高查询性能:函数索引可以帮助加快查询速度,特别是在使用函数进行数据筛选或排序时。 提高数据的...
    99+
    2024-04-09
    oracle
  • 如何使用 Go 和 Spring 实现高效的函数索引?
    随着互联网的高速发展,数据量不断增加,如何快速地查找和处理数据成为了一个重要的问题。为了解决这个问题,我们可以使用函数索引来优化查询和处理效率。 在本文中,我们将介绍如何使用 Go 和 Spring 实现高效的函数索引。我们将从以下几个方面...
    99+
    2023-10-11
    索引 spring 函数
  • Oracle中怎么实现虚拟索引
    Oracle中怎么实现虚拟索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.创建一个测试表testSQL> create&...
    99+
    2024-04-02
  • 关于InnoDB索引的底层实现和实际效果
    目录一、索引底层实现1.1、局部性原理1.2、B树和B+树二、索引实际效果2.0、准备数据2.1、联合索引和最左前缀匹配2.2、全表扫描一定比使用索引慢?2.3、覆盖索引和回表查询2...
    99+
    2022-12-27
    InnoDB索引 InnoDB索引底层实现 InnoDB索引实际效果
  • 基于golang自定义函数实现的项目示例
    自定义函数允许在 go 应用程序中扩展功能。要创建自定义函数,请使用 func 关键字并声明其名称、参数和返回类型。注册函数以便使用,请使用 http.handlefunc 拦截 url...
    99+
    2024-04-27
    golang
  • 详解elasticsearch实现基于拼音搜索
    目录1、背景2、安装拼音分词器3、拼音分词器提供的功能4、简单测试一下拼音分词器4.1 dsl4.2 运行结果5、es中分词器的组成6、自定义一个分词器实现拼音和中文的搜索1、创建m...
    99+
    2023-01-16
    elasticsearch 拼音搜索 elasticsearch 搜索
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作