问题描述
嗨,汤姆,
我们有一个自定义暂存表 (例如xyz) (近似分析行数: 252,011,477表大小: 26,358 MB)。
此表包含event_id、event_status列。根据现有设计,有一个基于event_id的索引 (例如xyz1)。
(event_status有3个不同的值)
作为微调以下查询性能的一部分,我更改了索引 (xyz1) (删除了现有的索引,并通过添加event_status列创建了新的索引)。
我在索引更改之前和之后运行以下查询。SQL计划解释如下。
无论是计划还是执行时间,我都看不到任何改进。你能帮我解决以下几点吗
1) 为什么没有任何改善?
2) 通常,我们总是使用event_id,event_status查询xyz表 (我们的conc. program也以相同的方式查询)。所以,创建一个复合指数
基于event_id,event_status真的可以帮助我们微调程序吗?
3) 在创建列作为索引之前,我需要考虑的任何分析技巧?
问候
安维什·库马尔·索马
我们有一个自定义暂存表 (例如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) 在创建列作为索引之前,我需要考虑的任何分析技巧?
问候
安维什·库马尔·索马
专家解答
查看每个计划的底部
这表明您仍然只使用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-奇怪的是,如果可能的话,我们不会使用索引中的所有列进行范围扫描。
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




