Показываю усложненным примером с ntile для старых версий оракла(в последних есть pivot/unpivot), который вроде должен пойти и для PostgreSQL.
Например, есть таблица:
Кстати, в дополнение к тому, что верно сказал zhekappp, еще могу посоветовать скрипты Танела Подера(snapper, latchprofx и тд). А вообще(не знаю, конечно, какие проблемы решаете вы) серьезные проблемы производительности обычно либо замечаются и решаются сразу, либо легко видны в awr(или еще где-нибудь, в зависимости от характера проблемы), либо легко повторяются. У нас хранение awr две недели — если за этот срок не сообщили о проблеме, значит это и не проблема…
Вообще, в прнципе не существует хинтов, которые могут влиять на результат выборки, разве что только на порядок строк или при использовании rownum, хотя и на это нельзя ни в коем случае нельзя закладываться в разработке :)
Эхъ, если бы… :) да и ладно для выборки… а для инсертов которые? :)
Мы говорим про хранимую логику — зачем полный дамп? Если речь идет не об изменении структур данных и самих данных, которые безразлично от местонахождения логики придется менять/откатывать, то местонахождение логики в базе практически ничем не отличается от промежуточных слоев. pl/sql — это тоже клиент.
Почитайте про Edition-Based Redefinition, почитайте старые проверенные простые методы. Все легко и просто. Вообще постарайтесь меньше делать громких заявлений, не имея знаний и опыта, т.к. со стороны это выглядит крайне ужасно.
Да даже если с безопасностью доступа все будет ок, то проблема сама в постановке задачи: 1) в безопасности выполнения самого триггера и 2) производительности. Я бы предложил решить выносить любые такие вызовы в AQ или job/scheduler.
Мде… я уже публиковал на хабре почти два года назад свое решение c таймаутом и пайплайнед, но оно выпилилось, когда отрубили ссылки: xt-r.com/2010/11/oracle-svn-git-etc.html
В oracle помимо pl/scope есть еще и встроенные предупреждения, активизируемые при включении параметра plsql_warnings в сессии или при компиляции конкретного объекта.
Пример:
DB11G/XTENDER> alter session set plsql_warnings='enable:all';
Session altered.
Elapsed: 00:00:00.02
DB11G/XTENDER> create procedure t_warning is
2 begin
3 null;
4 exception when others then null;
5 end;
6 /
SP2-0804: Procedure created with compilation warnings
Elapsed: 00:00:01.09
DB11G/XTENDER> sho err
Errors for PROCEDURE T_WARNING:
LINE/COL ERROR
-------- -----------------------------------------------------------------
1/1 PLW-05018: unit T_WARNING omitted optional AUTHID clause; default
value DEFINER used
4/16 PLW-06002: Unreachable code
В оракле это легко было бы: max() over(),min() over(),avg() over()
Например, есть таблица:
Код будет вроде такого:
Пример: