我应该使用此查询的索引吗?

时间:2011-10-25 20:03:30

标签: sql performance oracle sql-optimization

我对索引有疑问,

我在客户表上使用CID索引为什么,因为我正在查询此表以及加入预订表。

架构预订表

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 BID                                       NOT NULL NUMBER(16)
 CID                                                NUMBER(16)
 FNO                                                NUMBER(16)
 OID                                                NUMBER(16)
 SEAT                                               NUMBER(6)
 SEAT_PRICE                                         NUMBER(6)
 FLIGHT_DATE                                        DATE

客户

 CID                                       NOT NULL NUMBER(16)
 FIRSTNAME                                 NOT NULL VARCHAR2(10)
 LASTNAME                                  NOT NULL VARCHAR2(10)
 STREET                                    NOT NULL VARCHAR2(20)
 TOWN                                      NOT NULL VARCHAR2(10)

查询

SELECT bo.bid, cu.cid 
FROM ass2master_booking bo, ass2master_customer cu 
WHERE bo.cid = cu.cid and rownum < 135000; 

我的问题是:是否通过引用查询向CID添加索引真的有什么不同吗?

我添加了它,因为它已加入并被选中。

我使用非结构化数据(没有索引)测试了此查询,并且CPU没有显着减少,但跟踪文件中的磁盘列从1800减少到337.

非结构化磁盘为1800,索引为337。

索引正在对客户表进行快速全面扫描。

2 个答案:

答案 0 :(得分:2)

如果改善了性能,答案是肯定的。

不要添加索引只是为了添加它们。这很容易测试。索引查询要么更快,要么不是。请记住,索引在插入期间会减慢表格。因此,您必须权衡您的具体数据和性能需求。

答案 1 :(得分:1)

1)我在你描述的CID表中没有看到CUSTOMER列,这有点令人困惑。也许您的查询旨在引用FNO列,或者可能是CID列,您意外地从DESCRIBE命令的输出中删除了。

2)表中有多少行?您正在获取任意135,000行,并且您没有任何有意义的谓词,因此索引除了作为覆盖索引之外不会特别有用,因此Oracle可以扫描索引而不是扫描表。但是,如果您需要在SELECT列表中添加其他列,则该优势将消失。

3)鉴于您发布的查询,我对您加入CUSTOMER表的原因并不明显。 BOOKING同时包含BIDCID,因此加入似乎没有做任何有益的事情。也许意图是加入CUSTOMER表,以便您可以在SELECT列表中添加其他列。但是,如果是这种情况,覆盖索引的好处可能会丢失(当然,除非您将其他列添加到索引中)