Підвищення продуктивності розподіленого запиту, MS SQL Server, Бази даних, статті

sql.ru

За матеріалами статті Umachandar Jayachandran на sqlmag.com:

Speeding Up the Query

Вітаємо Кена Халі (Ken Haley), менеджера по розробках в SPECTRUM Human Resource Systems (Денвер, Колорадо) і Івена Стюарта (Ewen Stewart), програмного архітектора з Active Media Australia (Мельбурн, Австралія). Кен виграв перший приз у розмірі $ 100 за найкраще рішення задачі “Прискорення запиту “(серпневе змагання серед читачів). Івен отримав другий приз у розмірі $ 50.
У даній статті наводиться резюме знайденого рішення задачі.

Постановка завдання

Вирішуючи проблему низької продуктивності розподіленого запиту в коді програми, Дональд виявив, що SQL Server вибирає неефективний план виконання. Розподілений запит виконує операцію join між великою таблицею, розташованої на віддаленому сервері Prod1, і маленькою таблицею, розташованої на локальному сервері Prod2, причому отримує більшу кількість стовпців з віддаленої таблиці. Однак SQL Server на початку отримує всі рядки віддаленої таблиці, після чого виробляє операцію join на локальному сервері.

Для налагодження запиту Дональд створив тестовий сценарій, використовуючи таблиці Orders і Order Details бази даних Northwind. На віддаленому сервері він створив таку тестову таблицю:

 - На віддаленому сервері Prod1
USE Northwind
SELECT od.OrderID, od.ProductID, od.UnitPrice, od.Quantity,
od.Discount
INTO [New Order Details]
FROM (
SELECT TOP 500000 od1.OrderID, od1.ProductID,
od1.UnitPrice, od1.Quantity, od1.Discount
FROM [Order Details] AS od1
CROSS JOIN [Order Details] AS od2
ORDER BY od1.OrderID
) AS od
CREATE CLUSTERED INDEX IX_NewOrderDetail_ID ON
[New Order Details]( OrderID )

Потім на локальному сервері він написав наступний тестовий запит, який схожий на його розподілений запит:

 - На локальному сервері Prod2
SELECT o.OrderID, od.ProductID, od.UnitPrice, od.Quantity,
od.Discount
FROM Northwind.dbo.Orders AS o
JOIN Prod1.Northwind.dbo.[New Order Details] AS od
ON od.OrderID = o.OrderID

Необхідно допомогти Дональду оптимізувати запит (зменшити час виконання запиту і поліпшити продуктивність введення / виводу).

Рішення

Дональд вирішив використовувати опцію 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, 
od.Discount
FROM Northwind.dbo.Orders AS o
INNER REMOTE JOIN Prod1.Northwind.dbo.[New Order Details]
AS od
ON od.OrderID = o.OrderID

В результаті аналізу результату виконання запиту в SQL Server Profiler Дональд переконався, що використання REMOTE JOIN збільшує продуктивність запиту (він міг також виконати команду SET STATISTICS TIME ON в Query Analyzer і подивитися статистику виконання запиту після його виконання). Наступний приклад містить статистику, яку відображає Profiler для двох запитів:


Test Run 1
* CPU: 28581, Reads: 500302, Writes: 3, Duration: 90550
(without hint)
* CPU: 12708, Reads: 50, Writes: 0, Duration: 77593
(with REMOTE JOIN hint)
Test Run 2
* CPU: 33057, Reads: 500321, Writes: 0, Duration: 123840
(without hint)
* CPU: 14010, Reads: 50, Writes: 0, Duration: 97840
(with REMOTE JOIN hint)
Test Run 3
* CPU: 33057, Reads: 500321, Writes: 0, Duration: 125483
(without hint)
* CPU: 14391, Reads: 50, Writes: 0, Duration: 102446
(with REMOTE JOIN hint).

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*