2014-10-06 2 views
1

У меня довольно простой оператор SQL, который выполняется в базе данных Oracle 10g. Он перемещает некоторые данные из одной схемы в другую:Oracle заявление висит

CREATE TABLE TARGET.BIG_TABLE AS SELECT * FROM SOURCE.BIG_TABLE 
WHERE (COLUMN1, COLUMN2) IN (SELECT COLUMN1, COLUMN2 FROM TARGET.HELP_TABLE); 

Существует единственное ограничение в TARGET.HELP_TABLE для COLUMN1 и COLUMN2. В SOURCE.BIG_TABLE имеется только комбинированный первичный ключ (COLUMN1, COLUMN2, COLUMN3, COLUMN4, COLUMN5).

Нет проблем с самим утверждением, поскольку он уже выполнялся несколько раз во время тестирования в аналогичной тестовой среде.

Однако в реальной среде это заявление не проводило никаких операций ввода-вывода примерно через 3 часа. Через 8 часов мы прекратили казнь.

В чем причина такого поведения? И что я могу сделать, чтобы добраться до корня проблемы? У меня определенно нет подсказки!

+0

Заблокирован ли он незафиксированной транзакцией? –

+0

Теоретически это невозможно. Перед выполнением оператора все процессы, делающие транзакции в исходной схеме, отключены. Однако есть ли возможность узнать, почему заявление висит или почему оно ждет? – user3783827

+3

Запрос может занять так много времени. Вы проверили «EXPLAIN PLAN» [результат вашего запроса выбора] (http://www.orafaq.com/wiki/Explain_Plan) в производственной среде. –

ответ

1

Попробуйте избавиться от вложенных циклов в плане объяснений. Рассмотрим переписать запрос, используя внутреннее соединение:

SELECT /*+ use_hash(a b) */ 
     a.* 
    FROM SOURCE.BIG_TABLE a 
inner join (SELECT distinct COLUMN1, COLUMN2 FROM TARGET.HELP_TABLE) b 
    on b.COLUMN1 = a.COLUMN1 
    and b.COLUMN2 = a.COLUMN2; 

считают также использовать use_hash подсказку. Индексы не должны использоваться, когда вы выбираете ВСЕ строки (за исключением случаев, когда столбцы1 и столбец2 из help_table могут быть возвращены с быстрым полным сканированием индекса). Используйте distinct во внутреннем запросе, только если есть дубликаты.

Рассказать о добавлении parallel Подсказка.

Смежные вопросы