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

Oracle性能优化之虚拟索引

174次阅读
没有评论

共计 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、短信等云产品特惠热卖中