[Moscow.pm] Размышления на тему ORM и вообще работы с БД

Ivan Petrov i.petro.77.00 на gmail.com
Чт Окт 27 05:00:09 PDT 2011


>> А можно данные каких-нибудь тестов привести в доказательство этого
> тезиса? А то

> будут, если проект попадет на CPAN.

> Меня интересуют тесты производительности, а не юнит-тесты. Они могут (и должны)
> проводиться до выкладывания в production, даже до CPAN.

тут сравнивать то собственно не с чем.

сравнивать с DBI? этот модуль является над ним надстройкой, то есть
делает предобработку данных перед трансляцией ему, соответственно
будет всегда медленнее DBI работать.

сранивать с DBIC? DBIC делает:
1. генерацию запросов
2. генерацию запросов некачественных (с точки зрения
производительности SQL)
3. POST-обработку выборки и сплит ее в объекты (мы отказываемся
от этого сразу, ибо поскольку исключаем кривые запросы, то и
POST-обработка не нужна: то есть в нашем случае получается код в
предельном случае, состоящий из одной инструкции bless).

то есть узкое место в случае с DBIC будет база данных, которая его
кривые запросы будет мучиться исполнять.

соответственно единственные тесты производительности о которых можно
говорить это тесты "как быстро работает темплейтный парсер".

ну вот есть такой тестик.

    SELECT
        u.*
    FROM
        users AS u

    ?if{filters.role_name} {
        LEFT JOIN roles AS r ON u.rid = r.id
    }

    ?if{filters.user_name} {
        LEFT JOIN user_cards AS uc ON u.id = uc.uid
    }

    WHERE
        1 = 1

    ?if{filters.role_name} {
        AND r.name = ?{ filters.role_name }
    }

    ?if{filters.user_name} {
        AND uc.name = ?{ filters.user_name }
    }


на 1 = 1 пока не смотрим :), сейчас работаем над тем чтобы добавить
оператор для таких случаев. Соответственно тут вариантов обработки
данного запроса три:

1. Все фильтры включены (будет два JOIN'а)
2. Включен один из двух фильтров
3. Все фильтры выключены

времена предобработки такого запроса (после этого управление уйдет в
DBI) такие:

=cut

Two active filters
 1 wallclock secs ( 1.21 usr +  0.00 sys =  1.21 CPU) @ 8264.46/s (n=10000)
One active filter
 1 wallclock secs ( 1.03 usr +  0.00 sys =  1.03 CPU) @ 9708.74/s (n=10000)
No active filters
 1 wallclock secs ( 0.82 usr +  0.00 sys =  0.82 CPU) @ 12195.12/s (n=10000)

=cut


машинка, на которой это делается - P4/1600.

Отсюда видно, что узкое место тут явно будет БД (которая 8000
запросов на данном железе не сделает никогда), а не предобработчик
SQL.

PS: рисование более сложных запросов конечно приведет к большим
временам на предобработку, но очевидно, что более сложные запросы и БД
будет выполнять более долго. это первое.

второе: как ни крути, в рассматриваемом случае SQL-запросов будет три
для трех случаев: введен один фильтр, введено оба, не введен ни один.

и предобработка в этом случае требуется всегда. бесплатной она не
будет ни в каком варианте


Подробная информация о списке рассылки Moscow-pm