如何理解避免全表扫描

car*_*rlo 2 sql oracle query-optimization full-table-scan

我有一个表负责存储日志.DDL是这样的:

CREATE TABLE LOG(
    "ID_LOG" NUMBER(12,0) NOT NULL ENABLE, 
    "DATA" DATE NOT NULL ENABLE, 
    "OPERATOR_CODE" VARCHAR2(20 BYTE), 
    "STRUCTURE_CODE" VARCHAR2(20 BYTE), 

     CONSTRAINT "LOG_PK" PRIMARY KEY ("ID_LOG")
 );
Run Code Online (Sandbox Code Playgroud)

有这两个指数:

CREATE INDEX STRUCTURE_CODE ON LOG ("OPERATOR_CODE");

CREATE INDEX LOG_01 ON LOG ("STRUCTURE_CODE", "DATA") ;
Run Code Online (Sandbox Code Playgroud)

但是这个查询产生了一个完整的表扫描:

SELECT log.data AS data1, 
       OPERATOR_CODE,
       STRUCTURE_CODE
  FROM log
 WHERE data BETWEEN to_date('03/03/2008', 'DD-MM-YYYY')
                AND to_date('08/03/2015', 'DD-MM-YYYY')
   AND STRUCTURE_CODE = '1601';
Run Code Online (Sandbox Code Playgroud)

为什么我总是看到一个FULL TABLE SCANDATASTRUCTURE_CODE

(我也试过创建两个不同的索引STRUCTURE_CODE,DATA但我总是进行全表扫描)

Nec*_*aux 7

你在新索引和桌子上运行了统计数据吗?

该表中有多少数据,该查询可能返回多少百分比?有时,对于小型表或将返回大部分数据的查询,全表扫描更好.