Нужен совет по написанию собственного алгоритма загрузки - PullRequest
0 голосов
/ 29 мая 2009

Я поддерживаю собственный ORM, написанный на C #, и в настоящее время у него нет механизма быстрой загрузки. Чтобы повысить производительность, мы решили, что это потребует энергичной загрузки, поэтому нам нужно написать собственный код для поддержки этого. (Мои коллеги и я не имеем никакого опыта работы с какими-либо инструментами ORM, и, кроме того, по некоторым устаревшим причинам нам не разрешается использовать популярные инструменты, такие как LinqtoSQL, Entity Framework или Nhibernate.)

У меня такой вопрос, какова общепринятая лучшая практика для генерации готовых операторов SQL? Я подумал об этом и придумал два пути -

Предположим, классический пример из 4 таблиц - CustomerCategory имеет много клиентов У клиента много заказов Заказ имеет много OrderDetail

и при условии, что я хочу загружать данные из всех 4 таблиц, и мое условие - где Order.OrderDate между '2008-05-05' и '2008-12-31'

Метод 1 - Я генерирую ОДИН sql для извлечения данных из всех 4 таблиц, используя все внутренние объединения, чтобы получить одну строку для каждой уникальной комбинации первичных ключей каждой таблицы. Я буду применять мое условие Где к этому sql.

Метод 2 - Я генерирую SQL, чтобы сначала получить только данные заказа, и применяю условие «Где» к этому sql, так как Order.OrderDate происходит из таблицы Order. Затем, основываясь на результатах этого запроса, я узнаю все значения идентификатора заказа, которые мне нужны, поэтому я буду использовать их для получения подробных данных заказа. Я также буду знать все уникальные значения идентификаторов клиентов, которые мне нужны, поэтому я также буду использовать их для извлечения данных из таблицы клиентов, и, наконец, я сделаю то же самое для CustomerCategory. Этот метод потребует всего 4 оператора SQL.

Я вижу, что первый метод более эффективен, но один из моих коллег отметил, что 2-й метод, хотя он использует 4 оператора SQL, легче писать и поддерживать, что я согласен.

Будем весьма признательны за любые мысли по этому поводу. Спасибо!

1 Ответ

0 голосов
/ 29 мая 2009

Во-первых, модель вашего домена в корне неверна. Лично я не могу оправдать коллекцию Customer объектов в CustomerCategory, потому что это просто не имеет смысла с точки зрения производительности: большую часть времени вам нужен один клиент (плюс его группа), тогда как группа, полная клиентов, будет требуется один раз в голубой луне, но она будет там постоянно, вызывая всевозможные проблемы. То же самое относится к Customer, имеющему множество Order s.

Теперь к вашему вопросу. Обычно считается, что количество обращений к базе данных должно быть минимизировано, даже за счет получения большего количества данных, чем необходимо. Тем не менее, объединение двух больших таблиц (длинной и широкой) для одновременного выбора данных из двух связанных таблиц может снизить производительность, поэтому будьте осторожны.

Я рекомендую вам посмотреть, как это делается в NHibernate. Он позволяет вам указать стратегию выборки (присоединиться, выбрать) для каждой ассоциации, будь то связь один к одному или одна ко многим.

Если вы используете Microsoft SQL Server 2005 или более позднюю версию, вы можете использовать MARS , чтобы объединить несколько select s в один пакет, а затем гидрировать весь граф объектов, выдавая только одну команду SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...