Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6   вперед  Ctrl      все
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
softwarer
OraDen
У вас ошибка в скрипте вы создаете одну таблицу а читаете из другой

Точно. Впрочем, особой разницы это не внесло, благо и другая создана примерно так же.
Я прогнал ваш пример и у меня получилось для варианта с exception
Elapsed: 00:00:05.04
Для агрегирования
Elapsed: 00:00:05.03
Для цикла
Elapsed: 00:00:06.00
Так что ваш очевидный результат совсем не очевиден, откуда у вас вылезла разница более чем в 10 !!! раз?
23 авг 07, 11:58    [4564930]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
OraDen
откуда у вас вылезла разница более чем в 10 !!! раз?

Первый пошел
Множитель 2 у верхнего индекса не пропустили?
Вот там и прячется разница :)
23 авг 07, 12:03    [4564969]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
andrey_anonymous
OraDen
откуда у вас вылезла разница более чем в 10 !!! раз?

Первый пошел
Множитель 2 у верхнего индекса не пропустили?
Вот там и прячется разница :)
Я только цифири строк удалили из вашего кода, а остальное copy/paste так что извольте объяснить все же разницу :)
23 авг 07, 12:05    [4564985]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
andrey_anonymous
OraDen
откуда у вас вылезла разница более чем в 10 !!! раз?

Первый пошел
Множитель 2 у верхнего индекса не пропустили?
Вот там и прячется разница :)

declare
    mn integer ;
    mx integer ;
    o  varchar2(30);
  begin
    select min (object_id) into mn from MY_OBJECT ;
    select max (object_id) into mx from MY_OBJECT ;
    for i in mn..2 * mx loop
      begin
        select object_name into o
        from MY_OBJECT
        where object_id = i ;
      exception
        when no_data_found then o := null ;
      end ;
    end loop ;
  end ;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.05

declare
    mn integer ;
    mx integer ;
    o  varchar2(30);
  begin
    select min (object_id) into mn from MY_OBJECT ;
    select max (object_id) into mx from MY_OBJECT ;
    for i in mn..2 * mx loop
        select max ( object_name ) into o
        from MY_OBJECT
        where object_id = i ;
    end loop ;
  end ;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.08

declare
    mn integer ;
    mx integer ;
    o  varchar2(30);
  begin
    select min (object_id) into mn from MY_OBJECT ;
    select max (object_id) into mx from MY_OBJECT ;
    for i in mn..2 * mx loop
        o:= '';
        for k in (select object_name
                  from MY_OBJECT
                  where object_id = i)
        loop
          o:= k.object_name;
        end loop;
    end loop ;
  end ;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:06.00
И где же она эта разница?
23 авг 07, 12:14    [4565079]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
OraDen
И где же она эта разница?

Уточните пожалуйста версию сервера.
На девятке разница есть и лежит она в плоскости обработчика NO_DATA_FOUND - механизм exceptions в девяточном pl/sql не самый быстрый.
Правда, последний раз я это мерял еще на 9.2.0.мало - могли и усовершенствовать.
Тестировал пустой pl-блок как с конструкцией exceptions, так и без таковой и разница была вполне ощутима (не на порядок, конечно, но...)
2OraDen: это НЕ МОЙ код
23 авг 07, 12:24    [4565187]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
andrey_anonymous
OraDen
И где же она эта разница?

Уточните пожалуйста версию сервера.
На девятке разница есть и лежит она в плоскости обработчика NO_DATA_FOUND - механизм exceptions в девяточном pl/sql не самый быстрый.
Правда, последний раз я это мерял еще на 9.2.0.мало - могли и усовершенствовать.
Тестировал пустой pl-блок как с конструкцией exceptions, так и без таковой и разница была вполне ощутима (не на порядок, конечно, но...)
2OraDen: это НЕ МОЙ код
Да код не ваш, это softwarer постарался
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production
23 авг 07, 12:32    [4565276]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64019
Блог
andrey_anonymous
Александр, боюсь, своим "очевидным" результатом Вы собьете с толку многие неокрепшие умы.

Согласен, не подумал об этом.

andrey_anonymous
Пожалуйста, сами прокомментируйте назначение множителя у верхней границы цикла и дайте свою интерпретацию такой разницы performance. Это будет честно.

Ээ... слово "честно" здесь меня немного удивило.

Назначение множителя - обеспечить солидное количество попаданий в "запись не найдена", которая и определяет столь знаковый результат. Более четко эту тенденцию я бы показал, например, так:

SQL> create table testdata as select rownum id, object_name, object_type from dba_objects where rownum <= 5000 ;

Table created

SQL> select count(*) from testdata ;

  COUNT(*)
----------
      5000

SQL> alter table testdata add primary key ( id ) ;

Table altered

SQL> exec dbms_stats.gather_schema_stats ( ownname => user ) ;

PL/SQL procedure successfully completed

SQL> declare
  2  
  3    procedure test ( bound integer ) is
  4      time_start timestamp := systimestamp ;
  5      o varchar2(30) ;
  6    begin
  7      for i in 1..bound loop
  8        begin
  9          select object_name into o from testdata where id = i ;
 10        exception
 11          when others then null ;
 12        end ;
 13      end loop ;
 14      dbms_output.put_line ( rpad ( bound, 20, '.' ) || ( systimestamp - time_start )) ;
 15    end ;
 16  
 17  begin
 18    test ( 1000 ) ;
 19    test ( 2000 ) ;
 20    test ( 3000 ) ;
 21    test ( 4000 ) ;
 22    test ( 5000 ) ;
 23    test ( 6000 ) ;
 24    test ( 7000 ) ;
 25    test ( 8000 ) ;
 26    test ( 9000 ) ;
 27  end ;
 28  /

1000................+000000000 00:00:00.047000000
2000................+000000000 00:00:00.063000000
3000................+000000000 00:00:00.109000000
4000................+000000000 00:00:00.125000000
5000................+000000000 00:00:00.172000000
6000................+000000000 00:00:00.641000000
7000................+000000000 00:00:01.109000000
8000................+000000000 00:00:01.578000000
9000................+000000000 00:00:02.063000000

PL/SQL procedure successfully completed

- имхо по результатам видно, как резко отличается "тысяча попаданий" от "тысячи промахов".
23 авг 07, 12:50    [4565461]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
softwarer
- имхо по результатам видно, как резко отличается "тысяча попаданий" от "тысячи промахов".
У вас видимо что то не тик так
declare
    mn integer ;
    mx integer ;
    o  varchar2(30);
  begin
    select min (object_id) into mn from MY_OBJECT ;
    select max (object_id) into mx from MY_OBJECT ;
    for i in mn..10 * mx loop
      begin
        select object_name into o
        from MY_OBJECT
        where object_id = i ;
      exception
        when no_data_found then o := null ;
      end ;
    end loop ;
  end ;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:30.05

declare
    mn integer ;
    mx integer ;
    o  varchar2(30);
  begin
    select min (object_id) into mn from MY_OBJECT ;
    select max (object_id) into mx from MY_OBJECT ;
    for i in mn..10 * mx loop
        select max ( object_name ) into o
        from MY_OBJECT
        where object_id = i ;
    end loop ;
  end ;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:28.06
записей в MY_OBJECT порядка 50000, т.е. null рогоняется порядка 450000 и разница меньше 10 процентов по времени
23 авг 07, 13:07    [4565631]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
OraDen
softwarer
- имхо по результатам видно, как резко отличается "тысяча попаданий" от "тысячи промахов".
У вас видимо что то не тик так
..
имхо, таки версия сервера
23 авг 07, 13:10    [4565663]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
orawish
OraDen
softwarer
- имхо по результатам видно, как резко отличается "тысяча попаданий" от "тысячи промахов".
У вас видимо что то не тик так
..
имхо, таки версия сервера
Моя несколькими постами выше :)
23 авг 07, 13:17    [4565746]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
declare
    mn integer ;
    mx integer ;
    o  varchar2(30);
  begin
    select min (object_id) into mn from MY_OBJECT ;
    select max (object_id) into mx from MY_OBJECT ;
    for i in mn..20 * mx loop
      begin
        select object_name into o
        from MY_OBJECT
        where object_id = i ;
      exception
        when no_data_found then o := null ;
      end ;
    end loop ;
  end ;
/

PL/SQL procedure successfully completed.

Elapsed: 00:01:01.08


declare
    mn integer ;
    mx integer ;
    o  varchar2(30);
  begin
    select min (object_id) into mn from MY_OBJECT ;
    select max (object_id) into mx from MY_OBJECT ;
    for i in mn..20 * mx loop
        select max ( object_name ) into o
        from MY_OBJECT
        where object_id = i ;
    end loop ;
  end ;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:57.00

До кучи, разница укладывается все в те же 10 процентов
23 авг 07, 13:23    [4565815]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
OraDen


DECLARE
  FVALUE NUMBER;
BEGIN
  FOR C IN 1..100000 LOOP
    BEGIN
      SELECT CLI$.ID
      INTO   FVALUE
      FROM   CLI$
      WHERE  CLI$.ID = 102; -- попадание
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        FVALUE := NULL;
    END;
  END LOOP;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:04.95

DECLARE
  FVALUE NUMBER;
BEGIN
  FOR C IN 1..100000 LOOP
    BEGIN
      SELECT CLI$.ID
      INTO   FVALUE
      FROM   CLI$
      WHERE  CLI$.ID = -102; -- промах
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        FVALUE := NULL;
    END;
  END LOOP;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:70.84

Вывод - исключение это исключение, нефиг строить от них логику (в любом случае - тут тормоза +1000%).

Далее...

DECLARE
  FVALUE NUMBER;
BEGIN
  FOR C IN 1..100000 LOOP
    SELECT max(CLI$.ID)
    INTO   FVALUE
    FROM   CLI$
    WHERE  CLI$.ID = 102; -- попадание
  END LOOP;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:06.09
DECLARE
  FVALUE NUMBER;
BEGIN
  FOR C IN 1..100000 LOOP
    BEGIN
      SELECT CLI$.ID
      INTO   FVALUE
      FROM   CLI$
      WHERE  CLI$.ID = 102; -- попадание
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        FVALUE := NULL;
    END;
  END LOOP;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.04

Вывод - нефиг злоупотреблять MAX (5 vs 6 - те самые 20%)

Хотя...

DECLARE
  FVALUE NUMBER;
BEGIN
  FOR C IN 1..100000 LOOP
    SELECT max(CLI$.ID)
    INTO   FVALUE
    FROM   CLI$
    WHERE  CLI$.ID = -102; -- промах
  END LOOP;
END;
/

PL/SQL procedure successfully completed.

Elapsed: 00:00:05.93

Конечно уже лучше, чем 70 секунд (на эксепшинах)...

Но тут уже вопрос - сугубо философский. Если данные, которые выбираются в INTO,
имеют возможность отсуствия (как нормальная, не исключительная - ошибочная ситуация),
то для мозга типового кодера тут должен быть (для читабельности) именно явный цикл FOR SELECT
LOOP (который кстати, практически ничем не будет отличаться от SELECT INTO, по меньшей мере -
в 10-ке

Который....

DECLARE
  FVALUE NUMBER;
BEGIN
  FOR I IN 1..100000 LOOP
    FVALUE := NULL;
    FOR C IN 
    (
      SELECT CLI$.ID
      INTO   FVALUE
      FROM   CLI$
      WHERE  CLI$.ID = -102 -- промах
    ) LOOP
      FVALUE := C.ID;
    END LOOP;
  END LOOP;
END;
/
Elapsed: 00:00:05.13
23 авг 07, 13:32    [4565895]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
OraDen
До кучи, разница укладывается все в те же 10 процентов


У тебя какая то методика странная. Для чистоты эксперименту (расчета процентов)
- нужно лишние (по сути одинаково ресурсоемкие) операции - устранять. И не мешать все в одну кучу.

--

Короче, дядя, говно твоя методика тестирования, IMHO (кони в смятку).
23 авг 07, 13:36    [4565932]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64019
Блог
OraDen
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production

Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 - Production
With the Partitioning, OLAP and Data Mining options
23 авг 07, 13:37    [4565945]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
grexhide
Вывод - исключение это исключение, нефиг строить от них логику (в любом случае - тут тормоза +1000%).


Ну чтож, давайте бороться за чистоту методики...
1) надо исключить вероятную разницу в методах доступа
2) надо уточнять версию сервера
3) Ваш вывод относительно exception - в топку:
Connected to Oracle9i Enterprise Edition Release 9.2.0.7.0 

DECLARE
  FVALUE NUMBER;
BEGIN
  FOR C IN 1..100000 LOOP
    BEGIN
      SELECT 1
      INTO   FVALUE
      FROM   dual
      WHERE  1=1; -- попадание
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        FVALUE := NULL;
    END;
  END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 3.547 seconds

DECLARE
  FVALUE NUMBER;
BEGIN
  FOR C IN 1..100000 LOOP
    BEGIN
      SELECT 1
      INTO   FVALUE
      FROM   dual
      WHERE  1=0; -- промах
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        FVALUE := NULL;
    END;
  END LOOP;
END;
/

PL/SQL procedure successfully completed

Executed in 2.094 seconds

SQL> 
23 авг 07, 13:52    [4566091]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
Начальнег
Guest
А ведь вам всем действительно нехер делать на работе!
23 авг 07, 13:58    [4566129]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
grexhide
Конечно уже лучше, чем 70 секунд (на эксепшинах)...
Сдается мне что разница у вас не на эксцепшинах, а на том что строка которая существует в таблице находится по индексу быстрее чем строка которая не существует, так что отвечу вам вашей цитатой:
grexhide
Короче, дядя, говно твоя методика тестирования, IMHO (кони в смятку).
23 авг 07, 14:02    [4566164]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
grexhide
Member [заблокирован]

Откуда: Страна непреодолимых противоречий
Сообщений: 8553
andrey_anonymous

3) Ваш вывод относительно exception - в топку:


Я тестировал на 10.2.0.1 (казалось бы).

Прогнанные результаты Вашего кода дали, соответственно:

- 2 секунд
- 70 секунд
23 авг 07, 14:03    [4566181]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64019
Блог
softwarer
1000................+000000000 00:00:00.047000000
2000................+000000000 00:00:00.063000000
3000................+000000000 00:00:00.109000000
4000................+000000000 00:00:00.125000000
5000................+000000000 00:00:00.172000000
6000................+000000000 00:00:00.641000000
7000................+000000000 00:00:01.109000000
8000................+000000000 00:00:01.578000000
9000................+000000000 00:00:02.063000000

Прогнал то же на 10.2.0.2, картина аналогичная.
23 авг 07, 14:05    [4566199]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
grexhide
andrey_anonymous

3) Ваш вывод относительно exception - в топку:


Я тестировал на 10.2.0.1 (казалось бы).

Думаю, дело в этом.
Последние патчи для девятки пересекаются с некоторыми патчами десятки.
Попробуйте приподняться над 0.1 - думаю, данное усовершенствование PL/SQL Engine случилось не так давно.
Может, г-н Бегун прокомментирует?
23 авг 07, 14:06    [4566208]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
Начальнег
А ведь вам всем действительно нехер делать на работе!
У нас кризис
23 авг 07, 14:07    [4566230]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
OraDen
Member

Откуда:
Сообщений: 828
grexhide
andrey_anonymous

3) Ваш вывод относительно exception - в топку:


Я тестировал на 10.2.0.1 (казалось бы).

Прогнанные результаты Вашего кода дали, соответственно:

- 2 секунд
- 70 секунд
Elapsed: 00:00:04.05
и
Elapsed: 00:00:04.04
соответственно
23 авг 07, 14:11    [4566262]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
а также
Guest
код andrey_anonymous на 817
 попадание:
 Elapsed: 00:00:05.03
 промах:
 Elapsed: 00:00:04.02 
23 авг 07, 14:29    [4566422]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
а также
Guest
а также
код andrey_anonymous на 817
 попадание:
 Elapsed: 00:00:05.03
 промах:
 Elapsed: 00:00:04.02 

на 10.2.0.3 наблюдается указанная фигня с разрывом в более 10 раз

Дооптимизировали революционЭры...
23 авг 07, 14:38    [4566499]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по читабельности исходного кода  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 754
К вопросу о читабельности.
IMHO конечно.
FUNCTION get_field_by_id (
   id_in IN table.id%TYPE
)
   RETURN table.field%TYPE
IS
   retval table.field%TYPE;
BEGIN
   SELECT field
     INTO retval
     FROM table
    WHERE id = id_in;

   RETURN (retval);
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      RETURN NULL;
END get_field_by_id;

P.S. За вариант с циклом - расстрел без выходного пособия :-)
23 авг 07, 14:41    [4566526]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4 5 6   вперед  Ctrl      все
Все форумы / Oracle Ответить