2013-10-02 2 views
0

я написал SQL-запрос, как это:Fetch-Bulk-Collect с временем ForAll неточности

LOOP 

FETCH cursorA 
    BULK COLLECT INTO structure1 LIMIT 1000; 

EXIT WHEN structure1.COUNT = 0; 

FORALL i IN 1 .. structure1.COUNT 
    -- do something; 

--write time it took to finish loop 

END LOOP; 

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

  • Это намеренное поведение?

  • Может кто-нибудь объяснить, что происходит за сценой, чтобы вызвать это?

+0

Сколько еще? Ну, курсор должен быть открыт, и все вещи за кулисами должны быть подготовлены для выполнения этого массового сбора. –

+0

А, может быть, я должен указать время на то, как долго накладные расходы, прежде чем он даже начнет работать! Насколько вам известно, разницы во времени не следует ожидать? – confusedKid

+2

Проверьте план выполнения запроса. Существует ряд причин, по которым может потребоваться много времени, прежде чем он сможет начать испускать строки; например сортировка, хеш-соединения или полное сканирование таблицы (где совпадающие строки встречаются только в таблице). –

ответ

0

Из того, что мы знаем, ничего плохого в этом поведении.

Первое исполнение этого «выборки LIMIT 1000» может занять больше времени, потому что

  • он строит план выполнения запроса
  • это делает другие препараты, которые будут необходимы для каждой выборки

Кроме того, в зависимости от архитектуры вашего сервера db (например,> 1 proc), когда вы обрабатываете результат своей первой выборки, вторая выборка обрабатывается параллельно, делая вторую выборку Посмотрите короче (и то же самое для следующих).

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