2016-07-29 4 views
2

Я хотел знать, есть ли у нас какая-либо техника, с помощью которой мы можем вычислить значение, которое необходимо установить для предложения LIMIT операции массового сбора. Например, ниже, скажем, наш указатель имеет 10 миллионов записей. Какое значение мы можем установить для предложения LIMIT, чтобы иметь оптимальную производительность. Можно ли это вычислить.Установка значения для LIMIT при использовании группового сбора

decalre 
cursor c_emp is <some select query> 

var <variable> ; 

begin 
    open c_emp; 
     loop 
      fetch c_emp bulk collect into var limit 2; 
      exit when c_emp%NOTFOUND; 
     end loop; 
    close c_emp; 
    end; 
+2

Размер строки также будет фактором и объемом доступной памяти сеанса, учитывая количество сеансов, которые могут одновременно запускать процедуру. Я не знаю, какие другие факторы должны будут входить в полную модель оптимизации выборки, но обычно вы получаете уменьшающуюся отдачу, превышающую пару сотен строк. –

+2

Как и в любом случае, наилучшим подходом является сравнение в вашей среде с вашими данными. Как правило, что-то между 100 и 1000 будет довольно близко к оптимальному. Если вы использовали неявный курсор, а не явный, Oracle автоматически будет загружать 100 строк за раз под обложками. –

ответ

4

Используйте неявный курсор в курсоре FOR LOOP. Это делает код более простым, а значение по умолчанию 100 почти всегда достаточно хорошее.

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

Массовый сбор улучшает производительность за счет сокращения контекстных переключателей между SQL и PL/SQL. Представьте себе крайне маловероятный сценарий наихудшего случая, когда переключение контекста использует все время выполнения. Предел 2 исключает 50% контекстных переключателей; 10 исключает 90%; 100 устраняет 99% и т.д. Сюжет его, и вы поймете, что это не стоит найти оптимальный размер лимита:

enter image description here

Использование по умолчанию. Потратьте свое время на беспокойство о более важных вещах.

+1

Чтобы быть справедливым, OP может захотеть использовать массивный сбор для выполнения массива DML с 'forall' или с чем-то похожим, с которым цикл FOR курсора не поможет. Но приятное объяснение уменьшающейся отдачи. –