暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle Redd.索引对查询计划的影响

askTom 2017-03-20
291

问题描述

嗨,汤姆,

我们有一个自定义暂存表 (例如xyz) (近似分析行数: 252,011,477表大小: 26,358 MB)。
此表包含event_id、event_status列。根据现有设计,有一个基于event_id的索引 (例如xyz1)。
(event_status有3个不同的值)


作为微调以下查询性能的一部分,我更改了索引 (xyz1) (删除了现有的索引,并通过添加event_status列创建了新的索引)。

我在索引更改之前和之后运行以下查询。SQL计划解释如下。

select * from xyz where event_id=571 and event_status='INIT'

before index alteration : 

Plan hash value: 2648717349
 
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1599K| 163M| 235K (1)| 00:00:05 |
|* 1 | TABLE ACCESS BY INDEX ROWID| XYZ | 1599K| 163M| 235K (1)| 00:00:05 |
|* 2 | INDEX RANGE SCAN | XYZ1 | 9595K| | 24805 (3)| 00:00:01 |
---------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
  1 - filter("EVENT_STATUS"='INIT')
  2 - access("EVENT_ID"=571)
 
Note
-----
  - 'PLAN_TABLE' is old version

After index alteration.

  Plan hash value: 2648717349
 
---------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1599K| 163M| 235K (1)| 00:00:05 |
|* 1 | TABLE ACCESS BY INDEX ROWID| XYZ | 1599K| 163M| 235K (1)| 00:00:05 |
|* 2 | INDEX RANGE SCAN | xyz1 | 9595K| | 24805 (3)| 00:00:01 |
---------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
  1 - filter("EVENT_STATUS"='INIT')
  2 - access("EVENT_ID"=571)
 
Note
-----
  - 'PLAN_TABLE' is old version



无论是计划还是执行时间,我都看不到任何改进。你能帮我解决以下几点吗

1) 为什么没有任何改善?
2) 通常,我们总是使用event_id,event_status查询xyz表 (我们的conc. program也以相同的方式查询)。所以,创建一个复合指数
基于event_id,event_status真的可以帮助我们微调程序吗?
3) 在创建列作为索引之前,我需要考虑的任何分析技巧?

问候
安维什·库马尔·索马

专家解答

查看每个计划的底部

  1 - filter("EVENT_STATUS"='INIT')
  2 - access("EVENT_ID"=571)


这表明您仍然只使用EVENT_ID来访问索引。我发现有点奇怪-您可以共享表的DDL以及索引ddl之前/之后。

但是,如果event_status只有3个不同的值,您是否希望通过添加 “init” 来大幅减少行。我的意思是:

如果您有100,000行用于事件 = 571,并且其中90,000行 “init” 用于状态,那么额外的索引列并不能真正获得您的收益。但是,如果100,000中只有19行具有INIT,那将是一个巨大的好处。

如果您总是按event_status,eveent_id查询,请考虑将索引创建为:

创建索引...在...(事件状态,事件id) 压缩1

通过删除状态列来保持索引大小较低。

但是我想看到我提到的DDL-奇怪的是,如果可能的话,我们不会使用索引中的所有列进行范围扫描。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论