Oracle性能问题

时间:2016-12-14 07:12:28

标签: oracle performance query-performance sql-tuning

需要帮助查询效果。

我有一个表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);'

1 个答案:

答案 0 :(得分:1)

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

无论如何,在字段上创建单独的索引没有多大意义。 DBMS将选择一个索引(如果有)来访问该表。您可以尝试组合索引:

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

但是,当DBMS看到这方面的优势而不是简单地读取整个表时,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;