如何解决位图索引全扫描是否在 Oracle 中执行排序?
索引快速全扫描和索引全扫描之间的区别之一应该是索引快速全扫描读取叶子,就像它在磁盘中的存储方式一样。所以如果有order by子句就需要进行排序操作。但是索引全扫描按排序顺序读取叶子。因此,即使有索引列的 order by,也不应该在阅读后进行排序。但是在下面的执行中,它在使用索引全扫描读取后执行排序操作。你能告诉我原因吗?
解决方法
排序的原因是因为分区。
位图索引不能是分区表的全局索引。在本地索引中,特定索引分区中的所有键仅引用存储在单个基础表分区中的行。
记录可以分布在多个分区上。不进行排序,它们会逐个分区返回。
示例:
CREATE TABLE sales_part
( prod_id NUMBER(10,0),prod_date DATE
)
PARTITION BY RANGE (prod_date)
(
PARTITION sales_2020 VALUES LESS THAN (TO_DATE('31.12.2020','DD.MM.YYYY')),PARTITION sales_2021 VALUES LESS THAN (TO_DATE('31.12.2021','DD.MM.YYYY'))
);
INSERT INTO sales_part VALUES (1,TO_DATE('31.01.2020','DD.MM.YYYY'));
INSERT INTO sales_part VALUES (2,TO_DATE('28.02.2021','DD.MM.YYYY'));
INSERT INTO sales_part VALUES (3,TO_DATE('31.03.2020','DD.MM.YYYY'));
INSERT INTO sales_part VALUES (4,TO_DATE('30.04.2021','DD.MM.YYYY'));
CREATE BITMAP INDEX sales_part_idx1 ON sales_part(prod_id) LOCAL;
EXEC DBMS_STATS.GATHER_TABLE_STATS (ownname=> user,tabname => 'SALES_PART');
查询未排序:
SELECT prod_id FROM sales_part;
PROD_ID
----------
1
3
2
4
-----------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
-----------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 2 (100)| | | |
| 1 | PARTITION RANGE ALL | | 3 | 9 | 2 (0)| 00:00:01 | 1 | 2 |
| 2 | BITMAP CONVERSION TO ROWIDS | | 3 | 9 | 2 (0)| 00:00:01 | | |
| 3 | BITMAP INDEX FAST FULL SCAN| SALES_PART_IDX1 | | | | | 1 | 2 |
-----------------------------------------------------------------------------------------------------------------
查询排序:
SELECT prod_id FROM sales_part order by prod_id;
------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| | | |
| 1 | SORT ORDER BY | | 4 | 12 | 3 (34)| 00:00:01 | | |
| 2 | PARTITION RANGE ALL | | 4 | 12 | 2 (0)| 00:00:01 | 1 | 2 |
| 3 | BITMAP CONVERSION TO ROWIDS | | 4 | 12 | 2 (0)| 00:00:01 | | |
| 4 | BITMAP INDEX FAST FULL SCAN| SALES_PART_IDX1 | | | | | 1 | 2 |
------------------------------------------------------------------------------------------------------------------
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。