有什么办法可以在REFERENCETYPE列上使用索引。下面是表结构和执行计划。查询不使用索引 -
SQL> desc messaginginbox
Name Null? Type
----------------------------------------- -------- ---------------------------
MESSAGINGINBOXID NOT NULL VARCHAR2(28)
REFERENCEID NOT NULL VARCHAR2(28)
REFERENCETYPE VARCHAR2(1)
LISTINGID NOT NULL VARCHAR2(28)
CREATEDATE DATE
LASTUPDATED NOT NULL DATE
UPDATEDBY NOT NULL VARCHAR2(28)
RENTERLISTINGMANAGERID VARCHAR2(28)
OWNERLISTINGMANAGERID VARCHAR2(28)
OCA NOT NULL NUMBER(38)
SQL> create index idx_MESSAGINGIN_REFERENCE on MESSAGINGINBOX(REFERENCETYPE);
Index created.
SQL> analyze table MESSAGINGINBOX compute statistics;
Table analyzed.
SQL> select * from MESSAGINGINBOX where referencetype='B';
55 rows selected.
Execution Plan
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 71354 | 9M| 873 (1)|
|* 1 | TABLE ACCESS FULL| MESSAGINGINBOX | 71354 | 9M| 873 (1)|
-------------------------------------------------------------------------
SQL> create bitmap index idx_MESSAGINGIN_REFERENCE
on MESSAGINGINBOX(REFERENCETYPE);
Index created.
SQL> analyze table MESSAGINGINBOX compute statistics;
Table analyzed.
SQL> select * from MESSAGINGINBOX where referencetype='B';
55 rows selected.
Execution Plan
-------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|
-------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 71354 | 9M| 873 (1)|
|* 1 | TABLE ACCESS FULL| MESSAGINGINBOX | 71354 | 9M| 873 (1)|
-------------------------------------------------------------------------
SQL> select count(*) from MESSAGINGINBOX;
COUNT(*)
----------
142707
SQL> select distinct referencetype from MESSAGINGINBOX;
REFERENCETYPE
-------------
I
B
SQL> select count(distinct referencetype) from MESSAGINGINBOX;
COUNT(DISTINCTREFERENCETYPE)
----------------------------
2
你能运行'select referenceType,通过referenceType从MessageInbox组中计数(*);'?目前Oracle假设一半的值是“B”,一半是“I”。如果这是准确的,那么你可能不想使用索引。如果这不准确,请尝试用'begin dbms_stats.gather_table_stats(,'MESSAGINGINBOX')替换'analyze table';结束;'。另外,如果将ReferenceType列设置为“NOT NULL”,那么这将使Oracle在更多情况下使用索引。 –
感谢Jonearles,它为我工作,我使用DBMS_STATS视图来收集统计信息。 BitMap索引在这里有效地工作。计数I = 142652和B只有55.我想知道是否有任何替代BitMap索引。问这个问题的原因是,我需要在不同的机器上执行这个查询,我们使用的标准版本不允许使用BitMap索引。 –