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
Файл для хранения системных объектов
Нажимайте кнопку 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.



Комментарий: изменять значение Text 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, Мазуркин Сергей