Books OnLine (BOL) так определяет цель оптимизации - "минимизировать время ответа для каждого запроса и максимизировать производительность сервера базы данных путем сокращения сетевого трафика, операций ввода/вывода и загрузки процессора. Эта цель достигается, когда разработчик понимает потребности приложения, логическую и физическую структуру данных, понимает как достигнуть компромисса между конкурирующими запросами различных пользователей". Данная статья посвящена одному из аспектов оптимизации - сокращению времени выполнения операций ввода/вывода.

Значительную часть времени сервер данных тратит на ожидание диска. Самые длительные операции - операции механического перемещения головок к нужным данным и операции чтения/записи этих данных. Как правило, даже незначительное уменьшение времени ожидания диска приводит к существенному росту производительности. BOL рекомендует располагать часто используемые таблицы на независимых дисках. Тогда MS SQL сможет давать разным дискам команды на позиционирование, чтение и запись одновременно. Что позволяет значительно повысить быстродействие сервера в целом.

Комментарий: кстати, разработчики Axapta Database Sizing Tool придерживаются аналогичного мнения. В этом инструменте встречаются советы "использовать 10-15 небольших дисковых массивов размером 10-30Gb".

MS SQL позволяет указать на каком диске располагать те или иные таблицы. Сделать это можно при помощи FileGroups.

Комментарий: См. BOL, разделы Files and Filegroups и Placing Tables on Filegroups.

Microsoft Axapta не содержит в себе специальных инструментов для работы с FileGroup. FileGroup можно настроить средствами администрирования MS SQL. Аксапта не сопротивляется, не своевольничает и никогда не переопределяет настройки администратора.

Рекомендация: чтобы уменьшить время выполнения дисковых операций, используйте несколько физических дисков. В MS SQL размещайте таблицы и индексы на разных независимых дисках при помощи FileGroup.

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

 

Шаг 1. Создание базы данных в MS SQL

Создайте базу данных. Под данные отведите мегабайт 20-30, под журнал транзакций сколько планировалось (для тестов и демонстрационной версии вполне хватит мегабайт 50).

Комментарий: о рекомендациях по размеру журнала транзакций см. BOL, раздел Optimizing Transaction Log Performance

Какой бы размер будущей базы данных вы не планировали, не создавайте на этом шаге DataFile большого размера. В первом файле будут хранится только системные объекты базы данных (описания таблиц, полей, индексов, SQL пользователей и т.п.). Дело в том, что MS SQL не умеет дефрагментировать системные таблицы. Поэтому не рекомендуется держать системные объекты и сами данные вперемешку. На этом шаге создается место как раз для системных объектов, место для прикладных данных будет создаваться позднее. 20-30Mb для системных объектов вполне хватит.

Комментарий: вопросы дефрагментации данных, как и вопросы о системных объектах MS SQL в этой статье рассматриваться не будут. Смотрите BOL.

Создание новой базы данных в MS SQL Enterprise Manager
Создание новой базы данных в MS SQL Enterprise Manager

Файл для хранения системных объектов
Файл для хранения системных объектов

Нажимайте кнопку OK. MS SQL создаст новую базу данных.

 

Шаг 2. Создание FileGroups

Откройте свойства созданной базы данных и создайте файловые группы. Стоит создать, по крайней мере, две группы - axData и axDevelop.

В группе axData будут находится все Аксаптовские данные по-умолчанию. Поэтому разместите эту группу на быстром диске.

А в группе axDevelop будут размещаться данные для разработчиков - перекрестные ссылки, индексы по описаниям, поисковые индексы для Enterprise Portal и т.п. Эти данные не являются критичными. К этим данным вряд ли будет обращаться значительное число пользователей. Поэтому их можно разместить на медленном диске или в сети.

Комментарий: В реальной базе имеет смысл создать еще, по крайней мере, две группы - для хранения на отдельных дисках таблицы InventDim и таблиц LedgerBalances/LedgerBalancesDim. Количество создаваемых групп зависит от конфигурации сервера, от числа независимых дисков и от закупленных модулей. BOL рекомендует большие, часто связываемые таблицы размещать на независимых дисках в отдельных группах.

Создание файловых групп
Создание файловых групп

Создание файлов
Создание файлов

Обратите внимание, что каждый файл данных привязан к определенной файловой группе.

Комментарий: Не забудьте указать файловые группы до нажатия кнопки OK. Поскольку потом изменить привязку средствами Enterprise Manager будет невозможно.

Обратите также внимание, что у файловой группы axData установлена галочка Defaul. Это означает, что все создаваемые таблицы, поля, индексы и т.п. будут автоматически попадать в файловую группу axData. Что и требуется.

Сделать файловую группу группой по-умолчанию можно только после того, как будут созданы файлы. Таким образом шаг 2 выполняется в 3 действия:

  • откройте свойства, создайте файловые группы, нажмите ОК;
  • откройте свойства, создайте файлы и привяжие их к файловым группам, нажмите ОК;
  • откройте свойства, переключите default группу, нажмите ОК.

 

Шаг 3. Создание новой базы данных в Microsoft Axapta

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

Комментарий: В нашем примере все новые таблицы, поля и индексы будут созданы в файловой группе axDATA, а в файловой группе PRIMARY останутся только системные объекты.

Если у вас уже есть база данных, то вы можете оставить большинство таблиц в группе PRIMARY. Ничего плохого не случится. Но если вы озабочены фрагментацией данных, то для всех таблиц стоит изменить файловую группу с PRIMARY на axData.

Комментарий: для больших таблиц операция переноса данных в другую группу может выполняться продолжительное время. Кроме того, вручную переносить сотни таблиц неудобно. Лучше написать script, который будет выполнять перенос автоматически. Если вы не знаете как написать такой script, обратитесь к вашему администратору или к специалистам.

 

Шаг 4. Перенос выбранных таблиц в другую файловую группу

Теперь в базе данных таблицы созданы. Все Аксаптовские таблицы и индексы размещаются в группе axData. Пока таблицы пустые. Теперь самое время некоторые таблицы переместить в другую группу.

Таблицы, созданные Аксаптой

Прежде всего, надо переместить X-таблицы в файловую группу axDevelop.

Открыть Design

Свойства таблицы в окне Design Table

Привязка таблицы к FileGroup

Комментарий: изменять значение Text FileGroup для большинства таблиц Аксапты бесполезно. Оставьте эту группу со значением по-умолчанию. Обсуждение причин выходит за рамки данного совета.

Привязка индексов к FileGroup

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

Комментарий: MS SQL допускает, а BOL рекомендует размещать таблиц и индексы на независимых дисках. Обсуждение стратегий размещения выходит за рамки данного совета.

Комментарий: Внимательно отнеситесь к параметру Fill factor. При помощи этого параметра также можно добиться значительного прироста производительности. Обсуждение параметра Fill factor также выходит за рамки данного совета. Читайте BOL, смотрите специализированные статьи в сети.

Вот список таблиц, которые можно и нужно сразу перенести в файловую группу axDevelop:

  • XREFNAMES
  • XREFPATHS
  • XREFREFERENCES
  • XREFTABLERELATION
  • XREFTYPEHIERARCHY
  • SYSSEARCHNAME (только в Microsoft Axapta 3.0)
  • SYSSEARCHPATH (только в Microsoft Axapta 3.0)
  • SYSSEARCHREF (только в Microsoft Axapta 3.0)

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

 

Шаг 5. Заполнение данными

После того, как вы создадите в Аксапте перекрестные ссылки, индексы для описаний и хелпов... После того, как загрузите демонстрационные данные или немного поработаете с Аксаптой, вы получите примерно такое распределение данных по файловым группам.

Распределение данных по файловым группам

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

Кроме того, системные объекты MS SQL выделены в отдельную файловую группу и не перемешиваются с прикладными данными. Что дает небольшой, но прирост производительности.

Не останавливайтесь на этом минимальном делении. Анализируйте ваши запросы. Анализируйте использование таблиц. Главный и существенный прирост производительности дает размещение файловых групп на разные диски. Тогда MS SQL может давать команды дискам параллельно, что значительно сокращает время выполнения запросов.

 

Буду рад Вашим замечаниям и предложениям.
mazzy@mazzy.ru, Мазуркин Сергей