2016-12-14 132 views
0

需要帮助查询性能。Oracle性能问题

我有一个表加入一个视图,它需要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

请告诉我们你的表结构 –

+0

还包括安剑铮,卓杰表和视图二者的查询执行计划。 – JSapkota

+0

CREATE TABLE甲 ( ITEMID NUMBER, USER_NAME VARCHAR2(25 BYTE), CREATE_DATE DATE, SESSION_ID VARCHAR2(240 BYTE), STATUS VARCHAR2(20 BYTE) ) – Mahi

回答

1

查询加入表的视图比单独查询视图要慢吗?这并不奇怪,是吗?

无论如何,在字段上创建单独的索引没有什么意义。 DBMS将选择一个索引(如果有的话)来访问表。你可以尝试一个组成指数:

CREATE UNIQUE INDEX A_IDX4 ON A(status, session_id, itemid); 

但是,当它在简单地读取整个表看到这样的优点的DBMS将仍然只使用这个指标。这意味着,如果DBMS希望无论如何都必须读取大量记录,则不会通过索引间接访问它们。

在涉及您的查询最后两个备注:

  • 不要使用那些过时的以逗号分隔的连接。与明确的ANSI连接相比,它们的可读性更差并且更容易出错(FROM View B JOIN table A ON B.item_id = A.itemid)。
  • 在查询中使用多个表或视图时,对所有列使用限定符(and A.status='VALID' ...)。

更新:我看到现在,你是不是从表中选择任何列,那么为什么加入它呢?看起来你只是在查看表中是否存在记录,所以请相应地使用EXISTSIN。 (这可能不是使其更快,但至少很多更具可读性。)

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;