sql - 为什么此查询会导致 TABLE ACCESS FULL 而不是 FULL INDEX SCAN?

标签 sql oracle database-performance create-table

create table indexTest(
 col1 NUMBER,
 col2 NUMBER,
 COL3 NUMBER);

 create index indexTest_INX on indexTest(col2,col3);

分析索引indexTest_INX验证结构;

从indextest中选择col2,col3;

enter image description here

最佳答案

原因很简单。列被定义为NULLable,因此查询优化器无法使用覆盖索引。要获得INDEX FULL SCAN,您可以使用:

create index indexTest_INX on indexTest(col2,col3,0);
                              -- at least one NOT NULL column or literal

或将表列更改为NOT NULL

<强> DBFiddle Demo

输出:

select col2,col3 from indextest;

---------------------------------------------------
| Id  | Operation        | Name          | E-Rows |
---------------------------------------------------
|   0 | SELECT STATEMENT |               |        |
|   1 |  INDEX FULL SCAN | INDEXTEST_INX |      1 |
---------------------------------------------------

关于sql - 为什么此查询会导致 TABLE ACCESS FULL 而不是 FULL INDEX SCAN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50455119/

相关文章:

java - 如何将子记录的插入限制为N条记录?

sql - 将表复制到两个新表中

java - Spring NamedParameterJdbcTemplate 查询的性能非常慢

c# - 为 Oracle 返回一个记录集作为 HTML

mysql - 在 MySQL 中使用手动创建的临时表的缺点

sql - 数据库中的 View 是否可更新?

html - 选择语句中的 PDI 参数

sql - ORA-00903 : invalid table name

sql - 对于这种情况,为什么 SQL Azure 数据库性能在 Web 版和新高级版上差异如此之大

postgresql - PostgreSQL 上的表索引以提高性能