【发布时间】:2013-05-25 13:17:46
【问题描述】:
有什么方法可以在 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, count(*) from MessageInbox group by referenceType;吗?目前 Oracle 假设一半的值是“B”,一半是“I”。如果这是准确的,那么您可能不想使用索引。如果这不准确,请先尝试将analyze table替换为begin dbms_stats.gather_table_stats(<schema>, 'MESSAGINGINBOX'); end;。此外,如果将列 ReferenceType 设置为NOT NULL,这将使 Oracle 在更多情况下使用索引。 -
感谢 Jonearles,它对我有用,我使用 DBMS_STATS 视图来收集统计信息。位图索引在这里有效地工作。 I = 142652 和 B 的计数只有 55。我想知道是否有任何替代位图索引。问这个问题的原因是,我需要在我们使用不允许使用位图索引的标准版的不同机器上执行这个查询。
标签: database performance oracle sqlplus