| ||||||||||||||||
| ||||||||||||||||
| ||||||||||||||||
Повышение производительности распределенного запроса
По материалам статьи Umachandar Jayachandran на sqlmag.com:
Поздравляем Кена Хали (Ken Haley), менеджера по разработкам в SPECTRUM Human Resource Systems
(Денвер, Колорадо) и Ивена Стюарта (Ewen Stewart), программного архитектора из Active Media Australia
(Мельбурн, Австралия). Кен выиграл первый приз в размере $100 за лучшее решение задачи "Ускорение
запроса" ( Постановка задачи Решая проблему низкой производительности распределенного запроса в коде приложения, Дональд обнаружил, что SQL Server выбирает неэффективный план выполнения. Распределенный запрос выполняет операцию join между большой таблицей, расположенной на удаленном сервере Prod1, и маленькой таблицей, расположенной на локальном сервере Prod2, причем получает большее количество столбцов из удаленной таблицы. Однако SQL Server в начале получает все строки удаленной таблицы, после чего производит операцию join на локальном сервере. Для отладки запроса Дональд создал тестовый сценарий, используя таблицы Orders и Order Details базы данных Northwind. На удаленном сервере он создал следующую тестовую таблицу: -- На удаленном сервере Prod1 Затем на локальном сервере он написал следующий тестовый запрос, который похож на его распределенный запрос: -- На локальном сервере Prod2 Необходимо помочь Дональду оптимизировать запрос (уменьшить время выполнения запроса и улучшить производительность ввода/вывода). Решение Дональд решил использовать опцию REMOTE JOIN, так как она заставляет SQL Server 2000 (и SQL Server 7.0) выполнять операцию join не на локальном, а на удаленном сервере. Поскольку удаленная таблица содержит значительно больше строк, чем локальная таблица, использование опции REMOTE JOIN увеличивает скорость выполнения распределенного запроса Дональда. Опция REMOTE JOIN полезна, когда левая таблица в запросе локальна, а правая является удаленной. Дональд изменил тестовый запрос, добавив опцию REMOTE JOIN как показано в приведенном коде: SELECT o.OrderID, od.ProductID, od.UnitPrice, od.Quantity, В результате анализа результата исполнения запроса в SQL Server Profiler Дональд убедился, что использование REMOTE JOIN увеличивает производительность запроса (он мог также выполнить команду SET STATISTICS TIME ON в Query Analyzer и посмотреть статистику исполнения запроса после его исполнения). Следующий пример содержит статистику, которую отображает Profiler для двух запросов: Test Run 1 |
|
| ||||||||||||||||
|