阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle性能优化之虚拟索引

386次阅读
没有评论

共计 4630 个字符,预计需要花费 12 分钟才能阅读完成。

虚拟索引是定义在数据字典中的伪索引,但没有相关的索引段。虚拟索引的目的是模拟索引的存 – 而不用真实的创建一个完整索引。这允许开发者创建虚拟索引来查看相关执行计划而不用等到真实创建完索引才能查看索引对执行计划的影响,并且不会增加存储空间的使用。如果我们观察到优化器生成了一个昂贵的执行计划并且 SQL 调整指导建议我们对某些的某列创建索引,但在生产数据库环境中创建索引与测试并不总是可以操作。我们需要确保创建的索引将不会对数据库中的其它查询产生负面影响,因此可以使用虚拟索引。

下面举例进行说明
1. 创建一个测试表 test
SQL> create table test as select * from dba_objects;

Table created.

2. 从表 test 查询 object_name 等于 standard 的记录
SQL> select * from test where object_name=’STANDARD’;

OWNER
——————————
OBJECT_NAME
——————————————————————————–
SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
—————————— ———- ————– ——————-
CREATED      LAST_DDL_TIM TIMESTAMP          STATUS  T G S
———— ———— ——————- ——- – – –
SYS
STANDARD
                                      888                PACKAGE
19-APR-10    19-APR-10    2003-04-18:00:00:00 VALID  N N N

OWNER
——————————
OBJECT_NAME
——————————————————————————–
SUBOBJECT_NAME                  OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE
—————————— ———- ————– ——————-
CREATED      LAST_DDL_TIM TIMESTAMP          STATUS  T G S
———— ———— ——————- ——- – – –
SYS
STANDARD
                                      889                PACKAGE BODY
19-APR-10    19-APR-10    2010-04-19:10:22:58 VALID  N N N

3. 查询上面查询的执行计划
SQL> set autotrace traceonly explain
SQL> select * from test where object_name=’STANDARD’;

Execution Plan
———————————————————-
Plan hash value: 1357081020

————————————————————————–
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time    |
————————————————————————–
|  0 | SELECT STATEMENT  |      |    8 |  1416 |  155  (1)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| TEST |    8 |  1416 |  155  (1)| 00:00:02 |
————————————————————————–

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

  1 – filter(“OBJECT_NAME”=’STANDARD’)

Note
—–
  – dynamic sampling used for this statement

 

4. 在表 test 的 object_name 列上创建一个虚拟索引
SQL> create index test_index on test(object_name) nosegment;

Index created.

为了创建虚拟索引必须在 create index 语句中指定 nosegment 子句,并且不会创建索引段。

5. 来验证虚拟索引不会创建索引段
SQL> set autotrace off
SQL> select index_name from dba_indexes where table_name = ‘TEST’ and index_name = ‘TEST_INDEX’;

no rows selected

SQL> col OBJECT_NAME format a20;
SQL> select object_name, object_type from dba_objects where object_name = ‘TEST_INDEX’;

OBJECT_NAME          OBJECT_TYPE
——————– ——————-
TEST_INDEX          INDEX

从上面的结果可以看到索引对象已经创建,但没有创建索引段。

6. 重新执行 sql 查看创建的虚拟索引是否被使用
SQL> set autotrace traceonly explain
SQL> select * from test where object_name=’STANDARD’;

Execution Plan
———————————————————-
Plan hash value: 1357081020

————————————————————————–
| Id  | Operation        | Name | Rows  | Bytes | Cost (%CPU)| Time    |
————————————————————————–
|  0 | SELECT STATEMENT  |      |    8 |  1416 |  155  (1)| 00:00:02 |
|*  1 |  TABLE ACCESS FULL| TEST |    8 |  1416 |  155  (1)| 00:00:02 |
————————————————————————–

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

  1 – filter(“OBJECT_NAME”=’STANDARD’)

Note
—–
  – dynamic sampling used for this statement

从上面的执行计划可以清楚地看到创建的虚拟索引并没有被使用

7. 为了能使用所创建的虚拟索引,需要将_USE_NOSEGMENT_INDEXES 设置为 true
SQL> alter session set “_USE_NOSEGMENT_INDEXES” = true;

Session altered.

8. 重新执行 sql 查看创建的虚拟索引是否被使用
SQL> set long 900
SQL> set linesize 900
SQL> select * from test where object_name=’STANDARD’;

Execution Plan
———————————————————-
Plan hash value: 2627321457

——————————————————————————————
| Id  | Operation                  | Name      | Rows  | Bytes | Cost (%CPU)| Time    |
——————————————————————————————
|  0 | SELECT STATEMENT            |            |    8 |  1416 |    5  (0)| 00:00:01 |
|  1 |  TABLE ACCESS BY INDEX ROWID| TEST      |    8 |  1416 |    5  (0)| 00:00:01 |
|*  2 |  INDEX RANGE SCAN          | TEST_INDEX |  238 |      |    1  (0)| 00:00:01 |
——————————————————————————————

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

  2 – access(“OBJECT_NAME”=’STANDARD’)

Note
—–
  – dynamic sampling used for this statement

从上面的执行计划可以看到当设置隐含参数_USE_NOSEGMENT_INDEXES 后,优化器将会使用创建的虚拟索引。在使用虚拟索引需要注意,我们可以分析虚拟索引,但不能重建虚拟索引,如果重建虚拟索引会收到 ORA-8114: “User attempted to alter a fake index” 错误提示,可以删除虚拟索引。

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-04/130342.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计4630字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7801053
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...
12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...