Авторизация



Выполнение группирования на сервере базы данных

Оценить
(0 голоса)

Еще одной мощной функцией серверов баз данных SQL является обработка данных на стороне сервера, в частности группирование. Группирование на сервере касается способности SQL-сервера выполнять обобщающие вычисления по группам записей, возвращая клиенту только промежуточные суммы, сводки и другие итоговые данные. При создании итогового отчета (что случается достаточно часто), данная способность сервера может существенно сократить объем пересылаемых через сеть данных. Итоговые вычисления также могут выполняться не на клиенте, а на сервере.

Рассмотрим простой отчет по объемам продаж в регионах (Sales by Regions), который показан на рис. 15.30.

Это начало отчета, который просто включает всех клиентов из США (USA), группируя их по регионам и отображая для каждой отдельной группы количество клиентов и промежуточную сумму продаж. Поскольку отображается и раздел подробностей, серверу базы данных потребуется пересылать в Crystal Reports данные всех клиентов из США. Crystal Reports по мере обработки отчета фактически вычисляет на машине клиента промежуточную сумму продаж и количество клиентов. Это становится ясно при просмотре SQL-запроса для данного отчета (рис. 15.31).

Выполнение группирования на сервере базы данных

Рис. 15.31. SQL-запрос для отчета, показанного на рис. 15.30

Обратите внимание на то, что этот достаточно простой SQL-оператор просто подбирает поля базы данных и ограничивает записи только записями с данными по США. Единственной используемой здесь серверной функцией, помогающей с группированием, является конструкция ORDER BY, выполняющая предварительную сортировку набора результатов по регионам перед его отправкой клиенту.

Чтобы создать итоговый отчет, просто скройте раздел подробностей, щелкнув правой кнопкой мыши в закрашенной серым цветом области Details, которая расположена в левой части вкладки Design, и в появившемся контекстном меню выбрав пункт Hide (Drill-Down ОК) (Скрыть (детализация включена)). Теперь отчет будет показывать только итоговые данные: никакая информация об отдельных клиентах отображаться не будет (рис. 15.32).

Однако если вы посмотрите на SQL-запрос даже после обновления отчета, то изменений в нем не найдете, поскольку функция группирования на сервере по умолчанию отключена. Сервер по-прежнему отправляет в Crystal Reports сведения об абсолютно всех клиентах из США, a Crystal Reports приходится по-прежнему обрабатывать записи отдельных клиентов, чтобы вычислить количество клиентов и среднюю сумму продаж. Поля базы данных в разделе подробностей являются скрытыми, но база данных возвращает их в любом случае.

Выполнение группирования на сервере базы данных

Рис. 15.32. Отчет по объемам продаж в регионах, отображающий только итоговые данные

Включение функции группирования на сервере

Существует несколько способов включения функции, отвечающей за выполнение группирования на сервере:

•    Чтобы включить эту функцию только для текущего отчета, выберите в меню Database пункт Perform Grouping on Server (Выполнять группирование на сервере). Также можете выбрать в меню File пункт Report Options (Параметры отчета > и в появившемся диалоговом окне Report Options (Параметры отчета) установить флажок Perform Grouping on Server (Выполнять группирование на сервере). Или же щелкните правой кнопкой мыши в области Available Data Sources диалогового окна эксперта Database Expert и в контекстном меню выберите пункт Options.

•    Чтобы включить эту функцию для всех создаваемых в будущем отчетов, выберите в меню File пункт Options (Параметры) и отметьте флажок Perform Grouping on Server на вкладке Database (База данных) диалогового окна Options (Параметры).

После установки данной опции отчет измениться не должен. А вот в SQL-запросе появятся существенные изменения, как показано на рис. 15.33.

Выполнение группирования на сервере базы данных

Выполнение группирования на сервере базы данных

Конструкция SELECT теперь включает только поле группы (в данном случае — Region (Регион)) и две функции агрегирования, выполняющие операции суммирования и подсчета количества клиентов непосредственно на сервере перед отправкой данных клиенту. Также появилась новая конструкция GROUP BY, которой до этого не было. Эта новая конструкция заставляет сервер выполнять группирование записей базы данных и все суммарные вычисления. Клиенту будут отсылаться только итоговые суммы.

Условия для выполнения группирования на сервере

Чтобы можно было использовать функцию группирования на сервере, отчет должен соответствовать определенным критериям и быть составленным определенным образом. Задумавшись над тем, как сервер группирует и суммирует записи, вы начнете понимать, почему ваш отчет должен отвечать требованиям, которые перечислены в табл. 15.6.

Таблица 15.6. Условия для выполнения группирования на сервере

Эффекты детализации

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

Выполнение группирования на сервере базы данных

Однако, при включении функции группирования на сервере данных для отображения в разделе подробностей, когда пользователь детализирует отчет, не будет — клиенту отсылаются только суммарные данные! Тем не менее, Crystal Reports все равно разрешает детализацию, он просто отправляет другой запрос серверу SQL каждый раз, когда пользователь детализирует тот или иной объект в отчете. Второй запрос просто запрашивает данные раздела подробностей для детализируемой группы, добавляя дополнительные критерии в конструкцию WHERE. Этот метод позволяет воспользоваться преимуществами выполняемого на сервере группирования, при этом по-прежнему обеспечивая высокую интерактивность детализации. Цена, которую приходится заплатить пользователю — это дополнительное время, необходимое серверу SQL для обработки второго запроса.

Посмотрите на рис. 15.34. Обратите внимание на то, что пользователь детализировал определенный регион. Появилась новая вкладка детализации, отображающая подробные данные по этому региону. Обратите внимание на новый динамически сгенерированный SQL-запрос.

Рис. 15.34. SQL-запрос, сгенерированный для целей детализации

Просмотреть создаваемые для целей детализации SQL-запросы можно, выбрав при просмотре вкладки детализации э меню Database пункт Show SQL Query. Если вы вернетесь на основную вкладку Preview и отобразите запрос оттуда, вы опять увидите конструкцию GROUP BY.

Вопросы, касающиеся производительности

С базами данных SQL (или базами данных ПК, соединение с которыми устанавливается через ODBC) связан совершенной иной набор характеристик производительности, нежели с базами данных ПК. Как уже не раз упоминалось в этой главе, одним из главных преимуществ баз данных SQL по сравнению с базами данных ПК является способность сервера базы данных выполнять выбор записей и группирование локально сразу же при

Выполнение группирования на сервере базы данных

получении SQL-запроса из Crystal Reports. Сервер возвращает набор результатов обратно в Crystal Reports только после того, как самостоятельно выполнит выборку записей и группирование.

Переложите всю работу на сервер

Как правило, при составлении отчетов пользователь всегда желает, чтобы большая часть операций по обработке данных выполнялась сервером базы данных. Программное обеспечение для серверов баз данных рассчитано и соответствующим образом настроено для выполнения как раз таких операций, и часто устанавливается на очень мощных машинах с целью еще большего увеличения производительности. Наличие любой ошибки, которая может стать причиной того, что сервер будет отсылать обратно каждую запись базы данных (а базы данных SQL, содержащие миллион и более записей, — далеко не редкость) для ее локальной обработки системой Crystal Reports, в большинстве случаев приводит к неудовлетворительным показателям производительности.

Чтобы увидеть, какая часть запроса вычисляется (или вычисляется ли вообще хоть какая-нибудь часть запроса) на сервере базы данных, просмотрите запрос, выбрав в меню Database пункт Show SQL Query. Обратите внимание на конструкцию WHERE. Если таковая отсутствует, отбор записей вообще не будет выполняться на сервере, каждая запись в базе данных будет пересылаться на ПК для проведения сортировки самой системой Crystal Reports. А на это может уходить очень много времени!

При выполнении сортировки или группирования в отчете поищите конструкцию ORDER BY. Если таковая имеется, сервер базы данных будет предварительно сортировать данные перед их отправкой Crystal Reports. Это может существенно ускорить форматирование отчета. Если конструкция ORDER BY отсутствует, но группирование или сортировка была задана, сервер будет отсылать записи Crystal Reports несортированными, и клиент должен будет сортировать их самостоятельно.

При желании использовать функцию группирования на сервере удостоверьтесь в наличии в запросе конструкции GROUP BY. Это гарантирует, что сервер будет выполнять группирование и агрегирование данных до их отправки Crystal Reports. Если упомянутая конструкция отсутствует, посмотрите, удовлетворены ли условия использования функции группирования на сервере, перечисленные в табл. 15.6.

Для гарантии выполнения операции выбора записей на сервере Crystal Reports необходимо преобразовать формулу выбора записей в SQL-конструкцию WHERE. Ниже приводится несколько практических советов, позволяющих гарантировать преобразование большей части операций выбора записей в SQL и их выполнение на сервере.

•    Не используйте поля формул в качестве основы для выбора записей. Обычно Crystal Reports не удается преобразовать формулы в SQL, так что большинство операций выбора записей на основе полей формул будет передаваться на выполнение в Crystal Reports. Большинство формул первого прохода могут быть преобразованы в SQL, а вот остальные - нет. Проверяйте свои SQL-запросы, дабы убедиться в том, что формулы, используемые для выбора записей, были успешно преобразованы в SQL-конструкцию WHERE.

На заметку! Для получения более подробной информации о составных частях формул обращайтесь в главу 5.

460 Часть I. Проектирование отчетов

•    Не используйте в своих критериях выбора встроенные функции языка формул Crystal Reports, подобные ToText. Опять-таки, обычно Crystal Reports не может преобразовать эти функции в SQL, потому эти части операций по выбору записей не будут выполняться йа сервере. Возможно, получится отыскать подобную функцию в поле SQL-выражения и использовать для выбора записей выражение.

Использование индексированных полей

В Crystal Reports при просмотре вкладки Links диалогового окна Database Ехрег обычно можно увидеть разноцветные стрелки, которыми обозначены поля, проиндексированные разработчиком базы данных. Хотя устанавливать связь только по индексированным полям обязательным требованием не является, все равно по возможности след\ - ет пытаться устанавливать связи именно по таким полям (конечно, если это допускае^ структура базы данных). В зависимости от используемой системы управления базами данных, установка связей с неиндексированными полями или выполнение выбора записей по неиндексированным полям может крайне негативно сказаться на производительности отчета. Большинство систем баз данных SQL поддерживают возможности индексации, которые могут понадобиться разработчику во время создания базы данных.

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

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

 

Базы данных ПК используются все реже и реже
Подключение к базам данных SQL
Прямые драйверы баз данных
ODBC
OLE DB

Добавить комментарий


Защитный код
Обновить