0

我对索引有疑问,

我在客户表上使用 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。

通过索引对客户表进行快速全扫描。

4

2 回答 2

2

如果它提高了性能,答案是肯定的。

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

于 2011-10-25T20:11:26.547 回答
1

1)我没有在您描述CIDCUSTOMER表格中看到有点令人困惑的列。也许您的查询打算引用该FNO列,或者CID您不小心从命令的输出中截断了一个列DESCRIBE

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

3)鉴于您发布的查询,我不清楚您为什么要加入CUSTOMER表格。 BOOKING两者都有BIDCID所以加入似乎没有做任何有益的事情。也许目的是加入CUSTOMER表,以便您可以向SELECT列表中添加其他列。但是,如果是这种情况,覆盖索引的好处可能会丢失(当然,除非您也将其他列添加到索引中)

于 2011-10-25T20:12:14.407 回答