gpt4 book ai didi

oracle - 如何强制oracle使用索引范围扫描?

转载 作者:行者123 更新时间:2023-12-03 23:31:21 25 4
gpt4 key购买 nike

我对包含 14 亿条记录(带索引)的表运行了一系列极其相似的查询,唯一的问题是这些查询中至少有 10% 的执行时间比其他查询多 100 倍以上。

我运行了一个解释计划并注意到快速查询(大约 90%)Oracle 正在使用索引范围扫描;在较慢的情况下,它使用完整索引扫描。

有没有办法强制 Oracle 进行索引范围扫描?

最佳答案

要“强制” Oracle 使用索引范围扫描,只需使用优化器提示 INDEX_RS_ASC .例如:

CREATE TABLE mytable (a NUMBER NOT NULL, b NUMBER NOT NULL, c CHAR(10)) NOLOGGING;

INSERT /*+ APPEND */ INTO mytable(a,b,c)
SELECT level, mod(level,100)+1, 'a' FROM dual CONNECT BY level <= 1E6;

CREATE INDEX myindex_ba ON mytable(b, a);
EXECUTE dbms_stats.gather_table_stats(NULL,'mytable');

SELECT /*+ FULL(m) */ b FROM mytable m WHERE b=10; -- full table scan
SELECT /*+ INDEX_RS_ASC(m) */ b FROM mytable m WHERE b=10; -- index range scan
SELECT /*+ INDEX_FFS(m) */ b FROM mytable m WHERE b=10; -- index fast full scan

这是否会使您的查询实际运行得更快取决于许多因素,例如索引值的选择性或表中行的物理顺序。例如,如果您将查询更改为 WHERE b BETWEEN 10 AND <xxx> ,以下成本出现在我机器上的执行计划中:
b BETWEEN 10 AND    10     20      40     80
FULL 749 750 751 752
INDEX_RS_ASC 29 325 865 1943
INDEX_FFS 597 598 599 601

如果您稍微更改查询以不仅选择索引列 b ,但还有其他非索引列,成本发生了巨大变化:
b BETWEEN 10 AND    10     20      40     80
FULL 749 750 751 754
INDEX_RS_ASC 3352 40540 108215 243563
INDEX_FFS 3352 40540 108215 243563

关于oracle - 如何强制oracle使用索引范围扫描?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2473614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com