|
По материалам статьи Don
Schlichting: MS
SQL Server Distributed Partitioned Views В этой статье рассматривается использование распределенных секционированных представлений для доступа к множеству серверов MS SQL Server, сконфигурированных как объединение серверов БД. Содержание
В случае, когда необходимо получить дополнительную
производительность на сверхбольших базах данных, а ваши
хранимые процедуры уже оптимизированы, программное обеспечение
является многоуровневым и аппаратные средства модернизированы,
настает время для распределения вашей базы данных по
нескольким серверам. Для SQL Server это делается путем
горизонтального секционирования больших таблиц по множеству
серверов. Если разделение таблицы с множеством столбцов на
несколько таблиц с меньшим количеством столбцов является
вертикальным секционированием, то горизонтальным
секционированием считается разделение таблицы с множеством
записей на множество таблиц с меньшим количеством записей.
Если эти новые таблицы меньшего размера будут размещены на
разных серверах, то это называется объединенной базой данных.
Здесь используется слово "объединенный", потому что все
задействованные серверы могут работать совместно для
балансировки нагрузки. Они действуют как некое объединение.
Как только ваши данные распределяются по нескольким серверам,
для выборки записей становится необходимым новый тип
выражений. Эти новые выражения называются распределенными
секционированными представлениями. Они используют стандартные
выражения SQL вместе с ключевым словом UNION для получения
данных со всех распределенных серверов. Выражения DML (INSERT,
UPDATE, и DELETE) также могут использоваться при соблюдении
нескольких специальных правил, касающихся таблиц, лежащих в
основе распределенного секционированного представления. Хотя
прирост производительности варьируется в зависимости от
используемых приложений, обычно он составляет от 20 до
30%. Более детальное объяснение связанных серверов находится в
предыдущей статье Linked
Servers PART1
Параметру @server передается наш алиас. @datasrc - это имя
связываемого сервера. Если бы существовало несколько
экземпляров сервера, то был бы использован синтаксис
ИмяСервера\ИмяЭкземпляра.
Чтобы проверить связь между серверами, выполните:
В результате должны быть выбраны все записи из таблицы "Authors". Теперь мы должны повторить то же самое со второго сервера. Это создаст обратную связь с первым сервером server1. Все то же самое, кроме названия сервера и алиаса. Войдите в Query Analyzer второго сервера под "sa" и выполните:
Если бы были задействованы дополнительные серверы, то потребовалось бы связать их все друг с другом. Такую же схему мы бы имели с многодоменными, доверительными соединениями NT. Если бы в нашем объединении было четыре сервера, то была бы реализована следующая схема: Сервер1 имеет связанные серверы Сервер2, Сервер3 и
Сервер4. При этом нет никакой автоматизации ни при создании, ни при проверке таких обоюдных связей. В этом примере мы будем работать с подмножеством таблицы "Authors" базы данных "pubs". Представим себе, что таблица очень большая и большинство наших запросов используют поиск по фамилии. В этом случае мы могли бы разделить таблицу "Authors" на две части, храня на одном сервере фамилии от A до M, а на другом - от N до Z. Создайте и заполните тестовую таблицу на первом сервере server1.
На втором сервере server2 выполняется практически идентичный код. Ограничение CHECK изменено для нашего нового диапазона фамилий. Заметим, что у таблиц не обязательно должны быть те же имена на разных серверах. Таблица на первом сервере называется "AuthorsAM", а таблица на втором сервере - "AuthorsNZ". Наше представление уладит это.
Критической частью кода является ограничение. Ограничение CHECK должно гарантировать, что запись будет расположена в одной-единственной таблице. Во время выполнения нашего представления Query Optimizer использует эти ограничения для определения, какие серверы, какую часть распределенной работы получат. Распределенные секционированные представления Последним шагом является собственно создание представлений.
Оператор UNION используется для слияния результатов выборки из
обеих таблиц в один результирующий набор. См. BOL "Union
operator" для более детальных объяснений и правил.
На втором сервере server2 код опять практически тот же самый. Меняются только имена таблиц и сервера.
Простая выборка на первом сервере server1 создает следующий план выполнения: ![]() Видно, что результат сканирования локальной таблицы на первом сервере server1 сливается с результатом выполнения удаленного запроса на втором сервере server2. Наше представление следует всем стандартным правилам для представлений. Поэтому выборка части записей не требует ничего более, чем стандартное выражение:
Т.к. настройка объединения серверов не является быстровыполнимой задачей, то увеличение производительности путем использования распределенных секционированных представлений на больших таблицах может сделать такое решение более выгодным. В следующей статье эта тема будет продолжена обсуждением требований к DML на объединении серверов и методов оптимизации. |
Перевод Виталия Степаненко 2004г. |