Создание индекса / pk в огромной таблице занимает слишком много времени.Я использую Oracle.Как я узнаю, что все идет хорошо? - PullRequest
7 голосов
/ 07 октября 2010

У меня действительно огромная таблица с ~ 200 миллионами строк.У него не было никакого индекса / ПК вообще.Выборы в этой таблице (очевидно) работали медленно.Я решил создать ПК, используя 3 столбца.Я сделал это в тестовой среде, которая имеет уменьшенную версию этой таблицы, и она работала как шарм.

Итак, перед тем как вернуться домой, я сделал ALTER TABLE HUGETABLE ADD CONSTRAINT PK_HUGETABLE PRIMARY KEY (ID1, ID2, ID3);

Я ожидал, что он будет работать всю ночь, но это уже более 24 часов, и он все еще работает.

Я знаю, сохранил ли я Session Id до начала моего запроса iбудет в состоянии отследить это в V $ SESSION_LONGOPS.Но я не сделал.

Есть ли способ проверить, как проходит мой запрос или сколько времени он еще займет?

Ответы [ 2 ]

7 голосов
/ 07 октября 2010

Вы все равно сможете запросить V $ SESSION_LONGOPS.Если вы запустите что-то вроде

SELECT sid, serial#, start_time, sofar, totalwork, time_remaining, message
  FROM v$session_longops
 WHERE time_remaining > 0

, вы, вероятно, увидите только один сеанс, который начался вчера, а другие столбцы должны подтвердить это с указанием того, что сеанс проделал большую работу.СООБЩЕНИЕ также должно указывать что-то вроде полного сканирования на HUGETABLE.

0 голосов
/ 04 августа 2016

Вам не нужно запоминать свой идентификатор сессии, чтобы отслеживать состояние выписки. Как предположил Джастин, у вас не должно быть слишком много длительных запросов с предыдущего дня. Вы также можете указать время начала, чтобы сузить результаты.

select * from V$SESSION_LONGOPS where time_remaining > 0 and start_time > <'your run date/time here'>;

Помимо опции 'PARALLEL n', вам следует рассмотреть возможность использования опции 'ONLINE', если вы создаете (или перестраиваете) индекс, когда в HUGE TABLE происходят параллельные операции чтения / записи.

...