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

基于函数的索引

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

基于函数的索引

以下内容摘自《Oracle SQL 高级编程》 第12.4.2章节-基于函数的索引[其中代码部分被修改,原始请参考书籍]

如果一个谓语在索引列上应用了函数,则优化器不会选用该列上的索引。例如,对于谓语to_char(CYRQ, 'YYYY-MM-DD') = '2014-01-21',不会选用CYRQ列上的索引,因为在索引列上应用了to_char函数。这个限制可以通过表达式to_char(CYRQ)在创建基于函数的索引来克服。基于函数的索引预存函数的结果。谓语中所声明的表达式必须基于函数的索引所声明的表达式想匹配。

    基于函数的索引也可以建立在用户自定义函数上,但这个函数必须定义为确定性函数,也就是说对于这个函数的每一次执行必须返回一致的值。不遵守这一规则的用户自定义函数不能用来创建基于函数的索引。

    在代码清单12-14中,SELECT 语句使用to_char(CYRQ, 'YYYY-MM-DD') = '2014-01-21'子句来访问CK10_GHDJ表。如果没有基于函数的索引,优化器会选择全表扫描访问计划。通过表达式to_char(CYRQ, 'YYYY-MM-DD')增加了基于函数的索引INDEX_CK10_GHDJ_CYRQ2之后,优化器就为该SELECT语句选用了基于索引的访问路径。

CREATE INDEX INDEX_CK10_GHDJ_CYRQ2 ON CK10_GHDJ(TO_CHAR(CYRQ,'YYYY-MM-DD'));

SELECT COUNT(0)
  FROM CK10_GHDJ G
 WHERE TO_CHAR(G.CYRQ, 'YYYY-MM-DD') = '2014-01-21';

基于函数的索引

注意代码清单12-14中最后所打印出来的访问谓语“SYS_NC00009$”=’1000’。关于基于函数索引的一些实现上的细节列于代码清单12-15。基于函数的索引加入了一个虚拟列,所声明的表达式值作为默认值,然后在这个虚拟列上建立索引。这个虚拟列可从dba_tab_cols视图中可见,并且dba_tab_cols.data_default列显示了用来填充虚拟列的表达式。进一步的dba_ind_columns视图显示对虚拟列进行了索引。

SELECT DATA_DEFAULT, HIDDEN_COLUMN, VIRTUAL_COLUMN
  FROM DBA_TAB_COLS
 WHERE TABLE_NAME = 'CK10_GHDJ'
   AND VIRTUAL_COLUMN = 'YES';

基于函数的索引

    在增加了基于函数的索引后收集表的统计信息是很重要的。如果不收集,新的虚拟列就没有统计信息,这有可能会导致性能异常。脚本analyze_table_sfp.sql被用来收集表的统计信息并设置cascade=>true。代码12-16给出了analyze_talbe_sfp.sql脚本的内容。

代码清单12-16 Analyze_table_sfp.sql脚本

begin
  dbms_stats.gather_table_stats(ownname          => user,
                                tabname          => 'CK10_GHDJ',
                                estimate_percent => 30,
                                cascade          => true);
end;
/

         基于函数的索引也可以显示使用虚拟列来实现。在这个虚拟列上也可以增加索引。这种方法额外的好处就是你还可以使用虚拟列作为分区键来应用分区方案。在代码清单12-17中,使用virtual 关键字在表中加入了一个新的虚拟列cyrq_char。然后在cyrq_char列上建立了全局分区索引。SELECT语句的执行计划显示表使用新建的索引来访问,并且谓语to_char(CYRQ, 'YYYY-MM-DD') = '2014-01-21'被重写为谓语cyrq_char=’2014-01-21’以使用虚拟列。


免责声明:

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

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

基于函数的索引

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

下载Word文档

猜你喜欢

基于Java的全文索引引擎Lucene是怎样的

今天给大家介绍一下基于Java的全文索引引擎Lucene是怎样的。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。基于Java的全文索引引擎LuceneLucen
2023-06-03

mongodb基于索引为什么会快

MongoDB基于索引可以提高查询效率的原因主要有以下几点:1. 减少数据扫描:索引是按照特定的字段值进行排序和存储的数据结构,可以根据索引快速定位到符合查询条件的数据,从而减少了需要扫描的数据量,提高了查询效率。2. 提高数据的局部性原理
2023-08-23

关于python的索引

写了几天程序,深刻地感受到python语言中(特指numpy、pandas)对于数据强大的索引能力。特此总结一下:iloc和loc的区别https://www.cnblogs.com/ghllfl/p/8481576.htmlloc:通过行
2023-01-31

关于Mysql索引的数据结构

索引的数据结构1、为什么使用索引概念: 索引是存储索引用于快速找到数据记录的一种数据结构,就好比一本书的目录部分,通过目录中对应的文章的页码,便可以快速定位到需要的文章,Mysql 中也是一样的道理,进行数据查找时首先查看查询条件是否命中某条索引,符合则通过索
关于Mysql索引的数据结构
2017-04-22

MySQL 函数索引的优化方案

很多开发人员在使用MySQL时经常会在部分列上进行函数计算等,导致无法走索引,在数据量大的时候,查询效率低下。针对此种情况本文从MySQL5.7 及MySQL8.0中分别进行不同方式的优化。 1、 MySQL5.7MySQL5.7版本中不支
2022-05-18

[MySQL]ANALYZE TABLE 更新索引基数

MySQL使用存储的键分布基数来确定表连接顺序在决定对查询中的特定表使用哪些索引时,也会使用使用键分布基数ANALYZE TABLE 表名 可以更新表的索引基数,使其更接近非重复的记录数,记录数可以使用show index from 表 来查询cardinal
[MySQL]ANALYZE TABLE 更新索引基数
2020-02-08

COUNT函数与索引优化的关系

COUNT函数通常用于统计符合特定条件的行数,如果在查询中同时使用了COUNT函数和索引,可以通过索引优化来提高查询性能。索引可以帮助数据库系统快速定位符合COUNT函数条件的行,从而减少扫描整个表的时间消耗,提高查询效率。因此,在使用CO
COUNT函数与索引优化的关系
2024-08-11

基于函数计算的 BFF 架构

什么是 BFFBFF 全称是 Backends For Frontends (服务于前端的后端),起源于 2015 年 Sam Newman 一篇博客文章《Pattern: Backends For Frontends —— Single-
2023-06-04

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

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

基于函数执行的踩坑(addEventListener)

这篇文章主要介绍了基于函数执行的踩坑(addEventListener),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-01-28

编程热搜

目录