2016-12-14 8 views
0

Нужна помощь в выполнении запросов.Oracle performance Issue

У меня есть таблица A, соединяющая вид, и для получения результатов требуется 7 секунд. Но когда я делаю запрос на просмотр, я получаю результаты за 1 секунду. Я создал индексы в таблице А. Но никаких улучшений в запросе нет.

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

также включают план выполнения запросов agaist как таблицы и представления. – JSapkota

+0

CREATE Таблица A ( ItemId НОМЕР, USER_NAME VARCHAR2 (25 BYTE), CREATE_DATE ДАТА, SESSION_ID VARCHAR2 (240 BYTE), СТАТУС VARCHAR2 (20 BYTE) ) – Mahi

ответ

1

Так что запрос к соединению, соединенному с таблицей, медленнее, чем запрос к просмотру в одиночку? Это неудивительно, не так ли?

В любом случае, нет смысла создавать отдельные индексы в полях. СУБД выберет один индекс (если есть) для доступа к таблице. Вы можете попробовать составленный индекс:

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

Но СУБД будет по-прежнему использовать только этот показатель, когда он видит преимущество в этом более чем просто чтении всей таблицы. Это означает, что если СУБД ожидает, что в любом случае потребуется прочитать большой объем записей, он не будет косвенно обращаться к ним через индекс.

В двух последних замечаний по Вашему запросу:

  • Не используйте те, старомодной, разделенных запятыми присоединяется. Они менее читабельны и подвержены ошибкам, чем явные соединения ANSI (FROM View B JOIN table A ON B.item_id = A.itemid).
  • Используйте квалификаторы для всех столбцов при работе с более чем одной таблицей или просмотром в вашем запросе (and A.status='VALID' ...).

UPDATE: теперь я вижу, что вы не выбираете столбцы из таблицы, так почему бы присоединиться к ней на всех? Кажется, вы просто смотрите, существует ли запись в таблице, поэтому используйте 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;