Еле вспомнил где читал и специально нашел — прочитайте у Кайта в «Expert One-on-One Oracle» главу «Области PGA и SGA». Цитата у него про dbms_session.free_unused_user_memory: «Учтите, однако, что в большинстве систем это действие — пустая трата времени.»
Ну это зависит от конкретной ситуации, да и это уже относится к общему дизайну конкретной системы, и скачок с for update до dbms_aq мне кажется слишком резким особенно в рамках одной заметки. Кайт, например, в случае конкретного вопроса проверки блокировок просто советовал skip locked — тема слишком крупна для рассмотрения в одной заметке.
А про отладку и тестирование в общем-то я планировал отдельную статью написать, только вот не знаю когда в очередной раз поднимутся на это руки :)
Вообще вроде вполне известный факт. Кстати, вместо nextval можно было использовать seq.currval, и еще на эту тему вам возможно было бы интересно:
1. RESULT_CACHE clause,RELIES_ON в 11g
2. Inline функций в pl/sql в 11g
3. Рестарты(но тут это дикое кол-во информации)
1. «FORALL indx IN deptlist.FIRST..deptlist.LAST» с апдейтом и простой апдейт — вы все еще против Кайта?
2. Forall и For — Корреляцию размера группы с разницей в пожираемых ресурсах совсем не понимаете? То есть limit в forall кляузе они ввели чисто для прикола?
PS. Пожалуй, действительно стоит это заканчивать, если сейчас не понимаете, то и учить смысла не вижу. Если захотите, то почитаете.
Всего.
К следующему разу хотя бы выучите работу с коллекциями:
Вместо FORALL indx IN deptlist.FIRST..deptlist.LAST
UPDATE employee
SET salary = COALESCE(newsal_in, 1000)
WHERE employee_id = deptlist(indx);
лучше member of или in (select column_value from table(...))
О боже… Помимо всего этого вы еще procedure функциями называете и не отличаете функции от выражений… Как бы вообще то ни было, не можете написать адекватный пример — не беритесь.
Е-мае… Что за бред-то… Этот топик надо было назвать «как делать нельзя».
1. Т.Кайта не читали? если можно сделать одним SQL-запросом — надо делать одним запросом: UPDATE employee
SET salary = NVL(&newsal_in, 1000)
WHERE department_id = &department_in
2. где for update? Согласованность вам вообще побоку?
3. NVL нет в SQL? Вы в своем уме?
4. Вы знаете что с опр. версий for… in (select...) обрабатывает группами?
5. «Стоит также взять за правило помещать SQL операторы в отдельные процедуры и функции» — вы знаете что такое SQL операторы? и зачем вы их в отдельные процедуры и функции хотите запихнуть?
6. Все пихать в коллекции — вы представляете каких они размеров могут быть?
7. И всерьез считаете, что вот такие извраты разбиения одного SQL-запроса в процедуре быстрее чем один запрос и всегда? Вам ДБА еще не собираются голову оторвать?
7. Говорили об именования и оформлении кода — Так что за мрачный и страшный код пишите?
8. «Намеренно не освещены такие темы как обработка ошибок и логирование, CBO оптимизация запросов. Если будет интересно освещу эти моменты.» — ой ну конечно же… куда Кайту, Льюису и Фейерштейну до вас… У вас все в одном топике уместится…
Я не знаю MS SQL, подскажите, плиз, как identity и sequence работают с булк вставками, какой порядок генерации в параллельных сессиях? В Оракле у сиквенсов есть параметр cache, коего не вижу здесь.
А про отладку и тестирование в общем-то я планировал отдельную статью написать, только вот не знаю когда в очередной раз поднимутся на это руки :)
1. RESULT_CACHE clause,RELIES_ON в 11g
2. Inline функций в pl/sql в 11g
3. Рестарты(но тут это дикое кол-во информации)
2. Forall и For — Корреляцию размера группы с разницей в пожираемых ресурсах совсем не понимаете? То есть limit в forall кляузе они ввели чисто для прикола?
PS. Пожалуй, действительно стоит это заканчивать, если сейчас не понимаете, то и учить смысла не вижу. Если захотите, то почитаете.
Всего.
Вместо
FORALL indx IN deptlist.FIRST..deptlist.LAST
UPDATE employee
SET salary = COALESCE(newsal_in, 1000)
WHERE employee_id = deptlist(indx);
лучше member of или in (select column_value from table(...))
1. Т.Кайта не читали? если можно сделать одним SQL-запросом — надо делать одним запросом:
UPDATE employee
SET salary = NVL(&newsal_in, 1000)
WHERE department_id = &department_in
2. где for update? Согласованность вам вообще побоку?
3. NVL нет в SQL? Вы в своем уме?
4. Вы знаете что с опр. версий for… in (select...) обрабатывает группами?
5. «Стоит также взять за правило помещать SQL операторы в отдельные процедуры и функции» — вы знаете что такое SQL операторы? и зачем вы их в отдельные процедуры и функции хотите запихнуть?
6. Все пихать в коллекции — вы представляете каких они размеров могут быть?
7. И всерьез считаете, что вот такие извраты разбиения одного SQL-запроса в процедуре быстрее чем один запрос и всегда? Вам ДБА еще не собираются голову оторвать?
7. Говорили об именования и оформлении кода — Так что за мрачный и страшный код пишите?
8. «Намеренно не освещены такие темы как обработка ошибок и логирование, CBO оптимизация запросов. Если будет интересно освещу эти моменты.» — ой ну конечно же… куда Кайту, Льюису и Фейерштейну до вас… У вас все в одном топике уместится…