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

Откуда: сеРверная пальмира :)
Сообщений: 4898
Anton Demidov
DPH
Просто моя текущая система (одна из), так сложилось, в качестве БД использует Oracle - и я постоянно слышу от DBA (с ссылками на документацию и Кейта), что бизнес-логику эффективнее реализовать внутри БД. Правда, пояснить, почему так лучше, DBA так и не смог.

Потестируем? Только в новой ветке, а то здесь уже тесно стало.

Предлагаю создать пару таблиц по миллиону записей и сделать с ними что-нибудь (на ваш вкус) из Явы. Я, в свою очередь, напишу аналог на PL/SQL. У вас же Оракл есть - запустите пару раз и результаты тайминга сюда в форум потом на обсуждение.

В общем начал ветку. И просоединяюсь к тестированию.
5 июн 08, 17:41    [5766618]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение производительность обработки Oracle & Java  [new]
Anton Demidov
Member

Откуда: Atlanta, GA
Сообщений: 1187
Что будем обрабатывать?
5 июн 08, 17:46    [5766655]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение производительность обработки Oracle & Java  [new]
VoDA
Member

Откуда: сеРверная пальмира :)
Сообщений: 4898
Anton Demidov
Что будем обрабатывать?
А есть какой либо простой алгоритм, который вы у себя используете?

Сами данные тоже можно сгенерить алгоритмом.
5 июн 08, 17:48    [5766680]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение производительность обработки Oracle & Java  [new]
Anton Demidov
Member

Откуда: Atlanta, GA
Сообщений: 1187
Может что-нибудь типа подсчёта остатков?

--
Per rectum ad astrum
5 июн 08, 17:52    [5766714]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение производительность обработки Oracle & Java  [new]
Yo.!
Guest
кул, как я люблю мерятся
нужен такой алгоритм, какой заставит процедурно колбасить данные, иначе все сведется к меренью SQL диалектов (если DPH присоединится). подсчет остатков не сведется к одному-двум SQL ?
5 июн 08, 18:15    [5766856]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение производительность обработки Oracle & Java  [new]
Anton Demidov
Member

Откуда: Atlanta, GA
Сообщений: 1187
Именно это я и хотел показать: три тайминга для
  • реализации на чистом SQL
  • реализации на PL/SQL
  • реализации на Java

    Помнишь, тут кто-то засомневался в истинности заявлений Тома Кайта, что именно этот порядок отражает скорость обработки данных?
    Я сейчас готовлю скрипты для теста.

    --
    Per rectum ad astrum
  • 5 июн 08, 18:27    [5766909]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Anton Demidov
    Member

    Откуда: Atlanta, GA
    Сообщений: 1187
    -- Create tables
    create table TESTBIG
    (
      CLIENT       NUMBER not null,
      ORDER_ID     NUMBER not null,
      ORDER_AMOUNT NUMBER not null
    );
    
    alter table TESTBIG add constraint TESTBIG_PK primary key (CLIENT, ORDER_ID) using index;
    
    create table TESTTOTALS
    (
      CLIENT       NUMBER not null,
      CLIENT_TOTAL NUMBER
    );
    
    alter table TESTTOTALS add constraint TESTTOTALS_PK primary key (CLIENT) using index;
    
    -- Populate with data - inserts 1 million rows. Создаёт 128 клиентов
    INSERT /*+ APPEND */ INTO testbig
      (client, order_id, order_amount)
    SELECT ORA_HASH(id,127) client, id order_id, MOD(id,1000) amt
      FROM (SELECT LEVEL id FROM dual CONNECT BY LEVEL<=1000000);
    COMMIT;
    
    Задача программистам на Яве - заполнить TESTTOTALS суммой ORDER_AMOUNT из TESTBIG.

    P.S.
    Я тут особо не заморачивался - если есть желание что-то усложнить - предложения в студию.
    5 июн 08, 18:41    [5766966]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Yo.!
    Guest
    Anton Demidov
    Именно это я и хотел показать: три тайминга для
  • реализации на чистом SQL
  • реализации на PL/SQL
  • реализации на Java

    Помнишь, тут кто-то засомневался в истинности заявлений Тома Кайта, что именно этот порядок отражает скорость обработки данных?
    Я сейчас готовлю скрипты для теста.

    --
    Per rectum ad astrum


  • зачем ? такой тест есть в книге Кайта со всеми пояснениями за счет каких архитектурных особеностей оракла получаются такие результаты. тут все ясно, сомневающихся отправим читать Кайта, а не "одна бабка сказала".

    имхо было бы гораздо интересней взять реальную задачу и реализовать средствами pl/sql и апп-сервером/java и замерить, кол-во кода, скорость и т.п. просто меня волнует, чтоб задачка не сведась к одному SQL и апп-сервер просто бы не распечатал результат выданый субд.
    5 июн 08, 18:46    [5766985]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Anton Demidov
    Member

    Откуда: Atlanta, GA
    Сообщений: 1187
    Yo.!
    зачем ? такой тест есть в книге Кайта со всеми пояснениями
    Ах если бы это было возможно в обязательном порядке заставлять всех читать Кайта перед началом работы с Ораклом. К сожалению, это совершенно нереально. А так я им предлагаю шанс самим попробовать. Собственный опыт - он ценнее.
    5 июн 08, 18:54    [5767012]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Anton Demidov
    Member

    Откуда: Atlanta, GA
    Сообщений: 1187
    Извините, забыл команды сбора статистики во избежание недоразумений
    BEGIN
      DBMS_STATS.gather_table_stats(user,'TESTBIG',method_opt => 'for all indexed columns size auto' ,cascade => true);
      DBMS_STATS.gather_table_stats(user,'TESTTOTALS',method_opt => 'for all indexed columns size auto' ,cascade => true);
    END;
    /

    Теперь я жду от VoDA код на Яве.
    5 июн 08, 19:02    [5767050]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Yo.!
    Guest
    у меня такое предложение. сгенерить побольше табличку, чтоб она гарантирована сильно не влезла бы в память, миллионов на 500 записей, там одно поле телефона. задача распарсить тучу вариантов написания номера телефона и разложить код страны и очищеный номер по разным полям. не знаю умеет ли db2 regexp в SQL, но можно 2 варианта проверить - с regexp в SQL и с запретом на использования regexp. вот тут на апп-сервер и замерим, как ему понравится тягать гигобайты в свою память.
    5 июн 08, 19:03    [5767059]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    softwarer
    Member

    Откуда: 127.0.0.1
    Сообщений: 67534
    Блог
    Anton Demidov
    Ах если бы это было возможно в обязательном порядке заставлять всех читать Кайта перед началом работы с Ораклом.

    Читать - недостаточно, надо еще понять.
    5 июн 08, 20:08    [5767206]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    DPH
    Guest
    Не, давайте лучше скользящее среднее посчитаем. Еще и c парой десятков дополнительных правил расчета, зависящих от фазы луны ;) А лучше даже не одно, а штук десять разных средних.

    И, например, в таблицу добавляются значения со скоростью 100 в секунду (поштучно, в транзакциях), а запросы на, например, среднее отклонение скользящих средних за последние пять секунд приходят со скоростью 200 в секунду ;)

    А еще могу вспомнить бизнес-логику со старого проекта и вытащить правила расчета ставок в английском букмекерском бизнесе. И некоторые правила risk-managmentа там же.

    И реализовать нужно все на чистом SQL, разумеется.
    5 июн 08, 22:05    [5767498]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Anton Demidov
    Member

    Откуда: Atlanta, GA
    Сообщений: 1187
    Вы отвлекаетесь от основной задачи этого тестирования - сравнить скорость PL/SQL и Java.
    Решение на чистом SQL будет дано здесь, но только вне конкурса. Мы все (я надеюсь) прекрасно понимаем, что оно будет быстрее всех.

    Очевидно, что чем дальше мы отходим от реляционных задач (это к вашей "фазе луны"), тем выгоднее использовать универсальные ЯП типа С или Явы. С другой стороны, чем больше данных вам надо перебрать (это я по поводу таблицы на пол милиарда записей, предложенной Yo.!), тем "ближе" надо находится к БД для уменьшения издержек на пересылку данных.

    --
    Per rectum ad astrum
    5 июн 08, 22:59    [5767651]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Yo.!
    Guest
    2Anton Demidov

    несогласная я, если мы чуток усложним задачу, не только последние 5 секунд, но и в сравнении с 30-60-200 минут - так чтоб необходимо было тащить данные из субд, а не из кеша апп-сервера, то готовые алгоритмы не компенсируют оверхед доступа к данным. только это на порядок сложней тест и скорее всего уткнется в тюнинг субд, а не языков.
    6 июн 08, 00:26    [5767829]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    DPH
    Guest
    Увы, а у меня именно такого типа бизнес-логика, уже который проект. И нужны данные, не поверите, именно за последние несколько секунд, а не за месяц/год. И данные легко помещаются в оперативную память одного сервера. Впрочем, если добавить всю бизнес-логику, то, думаю, все равно Java будет быстрее (когда появляются динамические фильтры, сложные зависимости между элементами, введенные пользователем формулы, пара десятков настроек и т.п.).

    Зачем мне результаты искуственных тестов, к тому же изначально заточенных на SQL? Меня реальные задачи интересуют.

    Давай уж вернемся к исходной задаче - есть большой внешний поток данных, которые нужно привести к удобному виду, собрать статистику и эту статистику куда-нибудь выложить. Антон сообщит пяток статистик, которые занимают наибольшее время в его системе и пяток - с наименьшим. И посмотрим.
    С парой сотен крупных файлов.
    6 июн 08, 00:49    [5767852]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Anton Demidov
    Member

    Откуда: Atlanta, GA
    Сообщений: 1187
    Давайте идти от простого к сложному. Сначала разберёмся с этим примером, посмотрим на цифры. А потом начнём с обеих сторон предлагать усложнения ТЗ, призванные подчеркнуть преимущества одной либо другой технологии.
    Да, по поводу кода. Там мы просто откроем курсор на TESTBIG и внутри сохраняем сумму в TESTTOTALS. Как VoDA проснётся (а у него уже ночь наступила наверняка), он запостит свой код. Потом я свой. От этого и начнём плясать.

    --
    Per rectum ad astrum
    6 июн 08, 00:50    [5767855]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    DPH
    Guest
    Anton Demidov
    Вы отвлекаетесь от основной задачи этого тестирования - сравнить скорость PL/SQL и Java.

    Тогда задача должна быть другая. Например, матрицы перемножить 100*100 - это если арифметику измерять. Или какой-нибудь парсинг - для сравнения скорости обработки строк. По мне - лучше всего интерпретатор выражений (например, паскалевского - оно проще). С парой десятков собственных функций. И какую-нибудь сложную функцию посчитать по сотне тысяч значений (это ближе всего к скорости обработки бизнес-логики).


    Решение на чистом SQL будет дано здесь, но только вне конкурса. Мы все (я надеюсь) прекрасно понимаем, что оно будет быстрее всех.

    Конечно. Это именно та задача, на которую и рассчитаны SQL сервера. Другое дело, что в реальной жизни подобных запросов - меньшинство, увы. А обычно, если все делать в SQL, получаются десятки и сотни запросов по несколько страниц, сотни таблиц и т.д.


    Очевидно, что чем дальше мы отходим от реляционных задач (это к вашей "фазе луны"), тем выгоднее использовать универсальные ЯП типа С или Явы. С другой стороны, чем больше данных вам надо перебрать (это я по поводу таблицы на пол милиарда записей, предложенной Yo.!), тем "ближе" надо находится к БД для уменьшения издержек на пересылку данных.

    Кто бы спорил ;)
    Поэтому и приходится каждый раз решать задачу, как разделить задачу между БД, сервером приложений, Web-сервером и прочими компонентами.
    6 июн 08, 01:36    [5767908]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    The_ShadoW
    Member

    Откуда:
    Сообщений: 1134
    Вы, имхо, вообще уже давно не спорите, а каждый на свой манер соглашаетесь :)
    Anton Demidov уже подытожил в каком случае что и к чему склоняется. Если вы собрались тестами выявлять эти тенденции количественно - имхо, за годик разнообразного тестирования и будут какие-то показательные результаты, но не раньше.
    6 июн 08, 09:40    [5768260]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    VoDA
    Member

    Откуда: сеРверная пальмира :)
    Сообщений: 4898
    Anton Demidov
    Извините, забыл команды сбора статистики во избежание недоразумений
    BEGIN
      DBMS_STATS.gather_table_stats(user,'TESTBIG',method_opt => 'for all indexed columns size auto' ,cascade => true);
      DBMS_STATS.gather_table_stats(user,'TESTTOTALS',method_opt => 'for all indexed columns size auto' ,cascade => true);
    END;
    /
    Привет! что-то это у меня не запускается. На какой версии Oracle gather_table_stats работает? какой смысл применения этой команды?

    У меня: Oracle XE 10.2.0
    6 июн 08, 10:39    [5768707]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    Yo.!
    Guest
    VoDA
    Привет! что-то это у меня не запускается. На какой версии Oracle gather_table_stats работает? какой смысл применения этой команды?

    У меня: Oracle XE 10.2.0


    статистику обновляет (на всякий случай в данном случае), в XE точно есть, пользователя в кавычках попробуй указать.
    6 июн 08, 10:53    [5768824]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    VoDA
    Member

    Откуда: сеРверная пальмира :)
    Сообщений: 4898
    Anton Demidov
    Именно это я и хотел показать: три тайминга для
  • реализации на чистом SQL
  • реализации на PL/SQL
  • реализации на Java

    Помнишь, тут кто-то засомневался в истинности заявлений Тома Кайта, что именно этот порядок отражает скорость обработки данных?
    Я сейчас готовлю скрипты для теста.

    --
    Per rectum ad astrum
  • После прочтения Кайта я понял, что эти тайминги написаны для скорости работы всего ВНУТРИ Oracle.

    Говоря же про Java я имею в виду использование Java для обработки данных И JavaСУБД стартует внутри АппСервера. Таких таймингов у Кайта нет, хотя с его описанием и объяснениями я согласен.
    6 июн 08, 10:59    [5768864]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    VoDA
    Member

    Откуда: сеРверная пальмира :)
    Сообщений: 4898
    Anton Demidov

    Задача программистам на Яве - заполнить TESTTOTALS суммой ORDER_AMOUNT из TESTBIG.

    P.S.
    Я тут особо не заморачивался - если есть желание что-то усложнить - предложения в студию.


    Предложение: заменить NUMBER на int для большей совместимости типов.

    -- Create tables
    create table TESTBIG
    (
      CLIENT       int not null,
      ORDER_ID     int not null,
      ORDER_AMOUNT int not null
    );
    
    alter table TESTBIG add constraint TESTBIG_PK primary key (CLIENT, ORDER_ID) using index;
    
    create table TESTTOTALS
    (
      CLIENT       int not null,
      CLIENT_TOTAL int 
    );
    
    alter table TESTTOTALS add constraint TESTTOTALS_PK primary key (CLIENT) using index;
    Плюс сам алгоритм генерации данных реализовать на простейших циклах - для переносимости.
    6 июн 08, 11:02    [5768891]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    VoDA
    Member

    Откуда: сеРверная пальмира :)
    Сообщений: 4898
    Anton Demidov
    Вы отвлекаетесь от основной задачи этого тестирования - сравнить скорость PL/SQL и Java.
    Решение на чистом SQL будет дано здесь, но только вне конкурса. Мы все (я надеюсь) прекрасно понимаем, что оно будет быстрее всех.

    Очевидно, что чем дальше мы отходим от реляционных задач (это к вашей "фазе луны"), тем выгоднее использовать универсальные ЯП типа С или Явы. С другой стороны, чем больше данных вам надо перебрать (это я по поводу таблицы на пол милиарда записей, предложенной Yo.!), тем "ближе" надо находится к БД для уменьшения издержек на пересылку данных.

    --
    Per rectum ad astrum
    Давайте тогда уточним задачу
    В то, что Oracle через SQL обработает данные быстрее чем Апп Сервер тягающий данные из этой СУБД никто не сомневается.

    Изначальное описание здесь Задача обработать входящие данные.

    Для упрощения задачи:
    1. данные - это нечто вида CLIENT int not null, ORDER_ID int not null, ORDER_AMOUNT int not null (кстати а ORDER_AMOUNT может быть отрицательным). Внутренний формат задан жестко.
    2. Входные данные поступают в виде CSV файла разделенного ',' с переводом строки. Важно, что формат не подходит для bulk-insert операции. Сам формат может меняться, потому данные перед употребление нужно парсить.
    3. Файл сжат ZIP алгоритмом. Важно, что алгоритм сжатия может меняться, потому система должна иметь возможность изменить его.
    4. Строк в файле ~ 1 000 000.

    Нужно получить три клиента с самой большой суммой ORDER_AMOUNT, три клиента с самам большим количеством изменений ORDER_AMOUNT (больше всего записей в файле) и три клиента имеющие самый большой средний по ORDER_AMOUNT.

    Результат тупо выводится на экран.
    6 июн 08, 11:57    [5769402]     Ответить | Цитировать Сообщить модератору
     Re: Сравнение производительность обработки Oracle & Java  [new]
    VoDA
    Member

    Откуда: сеРверная пальмира :)
    Сообщений: 4898
    Anton Demidov

    Да, по поводу кода. Там мы просто откроем курсор на TESTBIG и внутри сохраняем сумму в TESTTOTALS. Как VoDA проснётся (а у него уже ночь наступила наверняка), он запостит свой код. Потом я свой. От этого и начнём плясать.
    Проснулся

    Код:
    INSERT INTO testtotals 
    SELECT client, SUM(order_amount) 
    FROM testbig
    GROUP BY client

    СУБД - Apache Derby. Все работает внутри моего приложения и исключительно на Java
    6 июн 08, 12:08    [5769499]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
    Все форумы / Сравнение СУБД Ответить