Oracle性能优化之虚拟索引

[[201247]]

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

下面举例进行说明:

1.创建一个测试表test

 

  1. SQL> create table test as select * from dba_objects; 
  2. Table created.

2.从表test查询object_name等于standard的记录

  1. SQL> select * from test where object_name='STANDARD'
  2.  
  3. OWNER 
  4.  
  5. ------------------------------ 
  6.  
  7. OBJECT_NAME 
  8.  
  9. -------------------------------------------------------------------- 
  10.  
  11. SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE 
  12.  
  13. ------------------------------ ---------- -------------- ----------- 
  14.  
  15. CREATED LAST_DDL_TIM TIMESTAMP STATUS T G S 
  16.  
  17. ------------ ------------ ------------------- ------- - - - 
  18.  
  19. SYS 
  20.  
  21. STANDARD 
  22.  
  23. 888 PACKAGE 
  24.  
  25. 19-APR-10 19-APR-10 2003-04-18:00:00:00 VALID N N N 
  26.  
  27. OWNER 
  28.  
  29. ------------------------------ 
  30.  
  31. OBJECT_NAME 
  32.  
  33. -------------------------------------------------------------------- 
  34.  
  35. SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE 
  36.  
  37. ------------------------------ ---------- -------------- ------------------- 
  38.  
  39. CREATED LAST_DDL_TIM TIMESTAMP STATUS T G S 
  40.  
  41. ------------ ------------ ------------------- ------- - - - 
  42.  
  43. SYS 
  44.  
  45. STANDARD 
  46.  
  47. 889 PACKAGE BODY 
  48.  
  49. 19-APR-10 19-APR-10 2010-04-19:10:22:58 VALID N N N 

3.查询上面查询的执行计划

  1. SQL> set autotrace traceonly explain 
  2.  
  3. SQL> select * from test where object_name='STANDARD'
  4.  
  5. Execution Plan 
  6.  
  7. ---------------------------------------------------------- 
  8.  
  9. Plan hash value: 1357081020 
  10.  
  11. -------------------------------------------------------------------------- 
  12.  
  13. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
  14.  
  15. -------------------------------------------------------------------------- 
  16.  
  17. | 0 | SELECT STATEMENT | | 8 | 1416 | 155 (1)| 00:00:02 | 
  18.  
  19. |* 1 | TABLE ACCESS FULL| TEST | 8 | 1416 | 155 (1)| 00:00:02 | 
  20.  
  21. -------------------------------------------------------------------------- 
  22.  
  23. Predicate Information (identified by operation id): 
  24.  
  25. --------------------------------------------------- 
  26.  
  27. 1 - filter("OBJECT_NAME"='STANDARD'
  28.  
  29. Note 
  30.  
  31. ----- 
  32.  
  33. dynamic sampling used for this statement 

 

4.在表test的object_name列上创建一个虚拟索引

  1. SQL> create index test_index on test(object_name) nosegment;Index created. 

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

5.来验证虚拟索引不会创建索引段

  1. SQL> set autotrace off 
  2.  
  3. SQL> select index_name from dba_indexes where table_name = 'TEST' and index_name = 'TEST_INDEX'
  4.  
  5. no rows selected 
  6.  
  7. SQL> col OBJECT_NAME format a20; 
  8.  
  9. SQL> select object_name, object_type from dba_objects where object_name = 'TEST_INDEX'
  10.  
  11. OBJECT_NAME OBJECT_TYPE 
  12.  
  13. -------------------- ------------------- 
  14.  
  15. TEST_INDEX INDEX 

 

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

6.重新执行sql查看创建的虚拟索引是否被使用

  1. SQL> set autotrace traceonly explainSQL> select * from test where object_name='STANDARD'
  2.  
  3. Execution Plan 
  4.  
  5. ---------------------------------------------------------- 
  6.  
  7. Plan hash value: 1357081020 
  8.  
  9. -------------------------------------------------------------------- 
  10.  
  11. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
  12.  
  13. -------------------------------------------------------------------- 
  14.  
  15. | 0 | SELECT STATEMENT | | 8 | 1416 | 155 (1)| 00:00:02 | 
  16.  
  17. |* 1 | TABLE ACCESS FULL| TEST | 8 | 1416 | 155 (1)| 00:00:02 | 
  18.  
  19. -------------------------------------------------------------------- 
  20.  
  21. Predicate Information (identified by operation id): 
  22.  
  23. --------------------------------------------------- 
  24.  
  25. 1 - filter("OBJECT_NAME"='STANDARD'
  26.  
  27. Note 
  28.  
  29. ----- 
  30.  
  31. dynamic sampling used for this statement 

 

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

7.为了能使用所创建的虚拟索引,需要将_USE_NOSEGMENT_INDEXES设置为true

  1. SQL> alter session set "_USE_NOSEGMENT_INDEXES" = true;Session altered. 

8.重新执行sql查看创建的虚拟索引是否被使用

  1. SQL> set long 900SQL> set linesize 900 
  2.  
  3. SQL> select * from test where object_name='STANDARD'
  4.  
  5. Execution Plan 
  6.  
  7. ---------------------------------------------------------- 
  8.  
  9. Plan hash value: 2627321457 
  10.  
  11. -------------------------------------------------------------------- 
  12.  
  13. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | 
  14.  
  15. -------------------------------------------------------------------- 
  16.  
  17. | 0 | SELECT STATEMENT | | 8 | 1416 | 5 (0)| 00:00:01 | 
  18.  
  19. | 1 | TABLE ACCESS BY INDEX ROWID| TEST | 8 | 1416 | 5 (0)| 00:00:01 | 
  20.  
  21. |* 2 | INDEX RANGE SCAN | TEST_INDEX | 238 | | 1 (0)| 00:00:01 | 
  22.  
  23. -------------------------------------------------------------------- 
  24.  
  25. Predicate Information (identified by operation id): 
  26.  
  27. --------------------------------------------------- 
  28.  
  29. 2 - access("OBJECT_NAME"='STANDARD'
  30.  
  31. Note 
  32.  
  33. ----- 
  34.  
  35. dynamic sampling used for this statement 

 

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

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/243491.html<

(0)
运维的头像运维
上一篇2025-04-25 07:12
下一篇 2025-04-25 07:13

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注