需要帮助查询效果。
我有一个表A加入一个视图,它需要7秒才能得到结果。但是当我在视图上选择查询时,我会在1秒内得到结果。 我已经在表A上创建了索引。但是查询没有任何改进。
SELECT
ITEM_ID, BARCODE, CONTENT_TYPE_CODE, DEPARTMENT, DESCRIPTION, ITEM_NUMBER, FROM_DATE,
TO_DATE, CONTACT_NAME, FILE_LOCATION, FILE_LOCATION_UPPER, SOURCE_LOCATION,
DESTRUCTION_DATE, SOURCE, LABEL_NAME, ARTIST_NAME, TITLE, SELECTION_NUM, REP_IDENTIFIER,
CHECKED_OUT
FROM View B,
table A
where B.item_id=A.itemid
and status='VALID'
AND session_id IN ('naveen13122016095800')
ORDER BY item_id,barcode;
CREATE TABLE A
(
ITEMID NUMBER,
USER_NAME VARCHAR2(25 BYTE),
CREATE_DATE DATE,
SESSION_ID VARCHAR2(240 BYTE),
STATUS VARCHAR2(20 BYTE)
)
CREATE UNIQUE INDEX A_IDX1 ON A(ITEMID);
CREATE INDEX A_IDX2 ON A(SESSION_ID);
CREATE INDEX A_IDX3 ON A(STATUS);'
答案 0 :(得分:1)
因此,查询加入表的视图比单独查询视图要慢吗?这并不奇怪,是吗?
无论如何,在字段上创建单独的索引没有多大意义。 DBMS将选择一个索引(如果有)来访问该表。您可以尝试组合索引:
CREATE UNIQUE INDEX A_IDX4 ON A(status, session_id, itemid);
但是,当DBMS看到这方面的优势而不是简单地读取整个表时,DBMS仍将只使用该索引。这意味着,如果DBMS希望无论如何都要读取大量记录,它就不会通过索引间接访问它们。
最后两条关于你的查询的评论:
FROM View B JOIN table A ON B.item_id = A.itemid
)相比,它们更不易读,更容易出错。and A.status='VALID'
...)。 更新:我现在看到,您没有从表中选择任何列,那么为什么要加入它呢?您似乎只是查询表中是否存在记录,因此请相应地使用EXISTS
或IN
。 (这可能不会让它变得更快,但至少更具可读性。)
SELECT
ITEM_ID, BARCODE, CONTENT_TYPE_CODE, DEPARTMENT, DESCRIPTION, ITEM_NUMBER, FROM_DATE,
TO_DATE, CONTACT_NAME, FILE_LOCATION, FILE_LOCATION_UPPER, SOURCE_LOCATION,
DESTRUCTION_DATE, SOURCE, LABEL_NAME, ARTIST_NAME, TITLE, SELECTION_NUM, REP_IDENTIFIER,
CHECKED_OUT
FROM View
WHERE itemid IN
(
SELECT itemid
FROM A
WHERE status = 'VALID'
AND session_id IN ('naveen13122016095800')
)
ORDER BY item_id, barcode;