Обновить
79
Sayan Malakshinov@xtender

FBCS, Oracle ACE, performance tuning expert

93
Подписчики
Отправить сообщение
да точно так же. внутри можно это получить как:
 , round((min(level)over() - avg(level) over())*100/5)*5
 , round((max(level)over() - avg(level) over())*100/5)*5
В postreSQL нет аналогов оракловых аналитических оконных функций?
В оракле это легко было бы: max() over(),min() over(),avg() over()
Показываю усложненным примером с ntile для старых версий оракла(в последних есть pivot/unpivot), который вроде должен пойти и для PostgreSQL.
Например, есть таблица:
SQL# select salary,department_id from hr.employees;

    SALARY DEPARTMENT_ID
---------- -------------
      2600            50
      2600            50
.......{skipped}..........
      4400            10

Код будет вроде такого:

SQL# select
  2    t1.n
  3    ,min(salary)
  4    ,max(salary)
  5    ,count(case when department_id between 1  and 40 then 1 end) d_1_40
  6    ,count(case when department_id between 41 and 70 then 1 end) d_41_70
  7    ,count(case when department_id between 71 and 120 then 1 end) d_71_110
  8  from (
  9        select salary
 10              ,department_id
 11              ,ntile(10)over(order by salary) n
 12        from hr.employees
 13       ) t1
 14  group by t1.n
 15  /

         N MIN(SALARY) MAX(SALARY)     D_1_40    D_41_70   D_71_110
---------- ----------- ----------- ---------- ---------- ----------
         1        2100        2500          1         10          0
         6        6400        7400          1          1          8
         2        2600        2900          3          8          0
         4        3200        4100          0         11          0
         5        4200        6200          2          6          3
         8        8400        9500          0          1          9
         3        2900        3200          1         10          0
         7        7500        8300          0          3          8
         9        9600       11000          1          1          8
        10       11500       24000          1          0          9

10 rows selected.
А почему не одним проходом с простым case (хотя тут даже видно простое округление до десятка) и группировкой?
Специалист по оптимизации производительности oracle, могу помочь с проблемами sql, pl/sql и тд
Кстати, в дополнение к тому, что верно сказал zhekappp, еще могу посоветовать скрипты Танела Подера(snapper, latchprofx и тд). А вообще(не знаю, конечно, какие проблемы решаете вы) серьезные проблемы производительности обычно либо замечаются и решаются сразу, либо легко видны в awr(или еще где-нибудь, в зависимости от характера проблемы), либо легко повторяются. У нас хранение awr две недели — если за этот срок не сообщили о проблеме, значит это и не проблема…
И я про это же :) например кучи багов с трансформацией ансишных джойнов да ивообще с трансформацией. Про инсерт я про новые игноры дубликатов и тд
Вообще, в прнципе не существует хинтов, которые могут влиять на результат выборки, разве что только на порядок строк или при использовании rownum, хотя и на это нельзя ни в коем случае нельзя закладываться в разработке :)
Эхъ, если бы… :) да и ладно для выборки… а для инсертов которые? :)
А что вы предлагаете как более надежное?
Озвучьте уже свою компанию…
Мы говорим про хранимую логику — зачем полный дамп? Если речь идет не об изменении структур данных и самих данных, которые безразлично от местонахождения логики придется менять/откатывать, то местонахождение логики в базе практически ничем не отличается от промежуточных слоев. pl/sql — это тоже клиент.
Почитайте про Edition-Based Redefinition, почитайте старые проверенные простые методы. Все легко и просто. Вообще постарайтесь меньше делать громких заявлений, не имея знаний и опыта, т.к. со стороны это выглядит крайне ужасно.
Да даже если с безопасностью доступа все будет ок, то проблема сама в постановке задачи: 1) в безопасности выполнения самого триггера и 2) производительности. Я бы предложил решить выносить любые такие вызовы в AQ или job/scheduler.
В свое решении я добавлял параметр таймаута для надежности: xt-r.com/2010/11/oracle-svn-git-etc.html
Мде… я уже публиковал на хабре почти два года назад свое решение 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
Все верно и насчет констрейнтов, это старый известный трюк, например, тут обсуждалось: www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=305675&msg=2791319 и насчет матвьюх. Но и у того и другого с конкурентностью и нагрузкой очень будет хреново :)
А сессии постоянно отстреливаете или это только в момент аварии делали?
Только там и на cnews и было интересно. В yammer'e выложили только огрызок алертлога. Здесь дилетантщину и крики читать вообще не интересно.

Информация

В рейтинге
Не участвует
Дата рождения
Зарегистрирован
Активность