2013-09-02 3 views
3

У меня есть это представление, которое должно отображать комментарии и ограничения (включая условия проверки, где это применимо) для столбцов некоторых таблиц в схеме.Oracle 11g: запрос метаданных очень медленный

По существу, я (слева) присоединяюсь к ALL_COL_COMMENTS ALL_CONS_COLUMNS к ALL_CONSTRAINTS.

Однако по какой-то причине это происходит очень медленно (занимает около 10 секунд), хотя у меня очень небольшое количество таблиц (всего 7), очень небольшое количество столбцов (всего 58 столбцов). Таким образом, запрос возвращает несколько результатов. И это все еще медленно. Что я могу сделать ?

CREATE OR REPLACE FORCE VIEW "MYDB"."COMMENTS_VIEW" ("TABLE_NAME", "COLUMN_NAME", "COMMENTS", "CONSTRAINT_TYPE", "CHECK_CONDITION") AS 
    SELECT r.TABLE_NAME, r.COLUMN_NAME, r.COMMENTS, DECODE(q.CONSTRAINT_TYPE,'P', 'Primary Key', 'C', 'Check Constraint', 'R', 'Referential Integrity Constraint'), q.SEARCH_CONDITION AS CHECK_CONDITION 
     FROM ALL_COL_COMMENTS r -- ALL_COL_COMMENTS has the COMMENTS 
      LEFT JOIN ALL_CONS_COLUMNS p ON (p.TABLE_NAME = r.TABLE_NAME AND p.OWNER = 'MYDB' AND p.COLUMN_NAME = r.COLUMN_NAME) -- ALL_CONS_COLUMNS links COLUMNS to CONSTRAINTS 
      LEFT JOIN ALL_CONSTRAINTS q ON (q.OWNER = 'MYDB' AND q.CONSTRAINT_NAME = p.CONSTRAINT_NAME AND q.TABLE_NAME = p.TABLE_NAME AND (q.CONSTRAINT_TYPE = 'C' OR q.CONSTRAINT_TYPE = 'P' OR q.CONSTRAINT_TYPE = 'R')) -- this gives us INFO on CONSTRAINTS 
    WHERE r.OWNER = 'MYDB' 
     AND 
    r.TABLE_NAME IN ('TABLE1', 'TABLE2', 'TABLE3', 'TABLE4', 'TABLE5', 'TABLE6', 'TABLE7') 
     AND 
    r.COLUMN_NAME NOT IN ('CREATED', 'MODIFIED', 'CREATED_BY', 'MODIFIED_BY') 
     ORDER BY r.TABLE_NAME, r.COLUMN_NAME, r.COMMENTS; 

ответ

0

Я бы либо использовал профилировщик запросов, либо (проще) просто удалил части вашего запроса, пока он не станет супер быстрым. Например, удалите вызов DECODE(), возможно, это так.

+0

пытался удалить часть декодирования - нет улучшения – MadSeb

0

Попробуйте присоединиться к таблице и идентификаторы столбцов вместо имен, где это возможно. Даже ВЛАДЕЛЕЦ, если можно. Пример:

ON p.TABLE_ID = r.TABLE_ID 

Кроме того, вы выбираете объекты, которые уже представляют, кто знает, сколько базовых таблиц. Оптимизатор запросов, вероятно, имеет трудное время (и, возможно, отказ от некоторых аспектов). Попробуйте перевести свой запрос на использование базовых таблиц.

2

Обеспечьте актуальность статистики словаря и фиксированного объекта. Проверка актуальной статистики - хороший первый шаг для почти любой проблемы с производительностью SQL. Словарь и фиксированные объекты необычны, и есть хороший шанс, который никто раньше не рассматривал для сбора статистики.

begin 
    dbms_stats.gather_fixed_objects_stats; 
    dbms_stats.gather_dictionary_stats; 
end; 
/
Смежные вопросы