我对索引有疑问,
我在客户表上使用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。
索引正在对客户表进行快速全面扫描。
答案 0 :(得分:2)
如果改善了性能,答案是肯定的。
不要添加索引只是为了添加它们。这很容易测试。索引查询要么更快,要么不是。请记住,索引在插入期间会减慢表格。因此,您必须权衡您的具体数据和性能需求。
答案 1 :(得分:1)
1)我在你描述的CID
表中没有看到CUSTOMER
列,这有点令人困惑。也许您的查询旨在引用FNO
列,或者可能是CID
列,您意外地从DESCRIBE
命令的输出中删除了。
2)表中有多少行?您正在获取任意135,000行,并且您没有任何有意义的谓词,因此索引除了作为覆盖索引之外不会特别有用,因此Oracle可以扫描索引而不是扫描表。但是,如果您需要在SELECT
列表中添加其他列,则该优势将消失。
3)鉴于您发布的查询,我对您加入CUSTOMER
表的原因并不明显。 BOOKING
同时包含BID
和CID
,因此加入似乎没有做任何有益的事情。也许意图是加入CUSTOMER
表,以便您可以在SELECT
列表中添加其他列。但是,如果是这种情况,覆盖索引的好处可能会丢失(当然,除非您将其他列添加到索引中)