Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как узнать размер pipe под Oracle10g  [new]
Alexei_Unregistered
Guest
Вопрос - как узнать фактический используемый размер пайпы на сервере?
Раньше для этого можно было воспользоваться вьюхой V$DB_PIPES. Однако
под Oracle10g (а именно, 10.2.0.2) выдаваемый размер этой вьюхой неадекватен.

Пример скрипта:
set serveroutput on
declare
  p varchar2(100) := 'XXX';
  s varchar2(2000):= lpad('*',2000,'*');
  x pls_integer;
begin
  x := dbms_pipe.remove_pipe(p);
  for i in 1..5 loop
    dbms_pipe.reset_buffer;
    dbms_pipe.pack_message(s);
    x := dbms_pipe.send_message(p,1,8192);
    if x<>0 then
      dbms_output.put_line('Iteration: '||i||', Status (1=timeout): '||x);
      exit;
    end if;
  end loop;
  select pipe_size into x from v$db_pipes where name=p;
  dbms_output.put_line('Pipe: '||p||', Size: '||x);
  x := dbms_pipe.remove_pipe(p);
end;
/

Скрипт пытается записать в пайпу с ограничением 8192
строку длиной 2000 5 раз (4 раза удачно, на пятый - облом,
т.е. все - как учили).
После этого выдается получившийся размер из V$DB_PIPES.

Результат Oracle9i:
Iteration: 5, Status (1=timeout): 1
Pipe: XXX, Size: 8788

Результат Oracle10g:
Iteration: 5, Status (1=timeout): 1
Pipe: XXX, Size: 1412

Причем каких бы размеров я не задавал пайпы и сколько
бы туда ни писал, размер в V$DB_PIPES не более 1500.

Что это - бага или фича ?
22 мар 07, 15:35    [3929400]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать размер pipe под Oracle10g  [new]
Anton Demidov
Member

Откуда: Atlanta, GA
Сообщений: 1187
Может наконец-то dbms_pipe.pack_message заработал соответственно названию?

К слову, у меня на 9.2.0.8 размер буфера показался 9580 против 9500 на 10.1.0.4


--
Per rectum ad astrum
23 мар 07, 00:24    [3931286]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать размер pipe под Oracle10g  [new]
Alexei_Unregistered
Guest
V$DB_PIPES, насколько я понимаю, показывает фактический размер
выделенной памяти под пайпу. Т.е. в моем примере, записав "полезных"
8000 байт, мы имеем размер больше 8000, т.к. он включает в себя
некий overhead (который, что вполне объяснимо, зависит от версии
Oracle). Под 10.2.0.2, похоже, показывается размер только некоего
начального headera, который не зависит от того, сколько туда реально
записано информации (в т.ч. и "полезной"). Можно оформить ноу-хау
по такому способу компрессии данных: пишем в пайпу 10 мегов
информации, а потом говорим, что все ужалось до 1.5K. Вот уж
воистину как у Козьмы Пруткова - "Не верь глазам своим".
23 мар 07, 10:25    [3931992]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать размер pipe под Oracle10g  [new]
Alexei_Unregistered
Guest
Зарегистрирован баг:
Bug 6034153 PIPE_SIZE IN V$DB_PIPES NO LONGER REFLECTS THE CURRENT PIPE SIZE.
10 май 07, 10:53    [4119273]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить