我有一個100萬行的表A.我有一個poliespa
列'03或'04'值的索引。Oracle沒有使用索引
CREATE INDEX A21 ON A(POLIESPA);
我的查詢:
SELECT polinpol,
policdde,
polipext,
polidext,
DECODE (polipext, 'T', polipdmx, 'A', polipdmx, polipdix),
politipo,
polipdtu,
DECODE (TO_NUMBER (RTRIM (LTRIM (polivmrd))), 0, 0, polivmrd),
RTRIM (LTRIM (polipdtx)),
polifeca
FROM A
WHERE poliespa = '03';
這個SQL查詢的解釋計劃,使全表掃描:
Plan hash value: 3450718889
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 369K| 14M| 6615 (3)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| A | 369K| 14M| 6615 (3)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("POLIESPA"='03')
塊 - 41735:
SELECT COUNT (
DISTINCT (SUBSTR (DBMS_ROWID.rowid_to_restricted (ROWID, 1), 1, 8)))
blocks
FROM A;
集羣:
SELECT index_name, clustering_factor
FROM user_indexes
WHERE index_name LIKE 'A21%'
INDEX_NAME CLUSTERING_FACTOR
-----------------
A21 79247
1 row selected.
任何人都可以幫助我理解爲什麼優化器不使用索引或爲什麼這是最好的方法?由於
編輯:
select count(*) from A
where poliespa = '03';
select count(*) from A
where poliespa = '04';
COUNT(*)
----------
221379
1 row selected.
COUNT(*)
----------
517095
1 row selected.
嘗試使用提示,文檔這裏https://docs.oracle.com/cd/B12037_01/server.101/b10752/hintsref.htm看看是否有幫助。類似於select/* + INDEX(table_name index_name)* /從表 – justMe
如果'poliespa'只有兩個值,那麼使用它可能不足以減少需要掃描的行數,以使索引值得。 –
[完整掃描並非邪惡;索引是不是所有的善良](https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:37453890985588)... –