gpt4 book ai didi

SQL 查询进行全表扫描而不是基于索引的扫描

转载 作者:行者123 更新时间:2023-12-04 06:32:22 25 4
gpt4 key购买 nike

我有两个表:

create table big( id number, name varchar2(100));
insert into big(id, name) select rownum, object_name from all_objects;

create table small as select id from big where rownum < 10;
create index big_index on big(id);

在这些表上,如果我执行以下查询:
select * 
from big_table
where id like '45%'
or id in ( select id from small_table);

它总是进行全表扫描。
Execution Plan
----------------------------------------------------------
Plan hash value: 2290496975
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3737 | 97162 | 85 (3)| 00:00:02 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL| BIG | 74718 | 1897K| 85 (3)| 00:00:02 |
|* 3 | TABLE ACCESS FULL| SMALL | 1 | 4 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - filter("ID"=45 OR EXISTS (SELECT /*+ */ 0 FROM "SMALL" "SMALL"

WHERE "ID"=:B1))

3 - filter("ID"=:B1)

有什么方法可以重写查询,以便它始终进行索引扫描。

最佳答案

不,不,不。

您不希望它使用索引。幸运的是,Oracle 比这更聪明。

ID 是数字。虽然它的 ID 值可能为 45,450,451,452,4501,45004,4500003 等,但在索引中这些值将分散在任何地方。如果您使用诸如 ID BETWEEN 450 AND 459 之类的条件,那么可能值得使用该索引。

要使用索引,它必须从上到下一直扫描它(将每个 ID 转换为一个字符以进行 LIKE 比较)。然后,对于任何匹配项,它必须关闭以获取 NAME 列。

它已经决定更容易和更快地扫描表(无论如何,75,000 行并不是那么大),而不是在索引和表之间来回切换。

关于SQL 查询进行全表扫描而不是基于索引的扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5255489/

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