Вопрос

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

Я посмотрел на план исполнения в SQL Sentry Plan Explorer - пожалуйста, найдите план выполнения ниже.

Как этот запрос может быть настроен на лучшую производительность? Есть ли в запросе явные ошибки? Есть ли какие -нибудь указатели, сообщения в блогах, которые помогут мне улучшить этот запрос?

Оба задействованных сервера являются SQL Server 2005

SELECT A.SETID
,A.CUST_ID
,A.CNTCT_SEQ_NUM
,A.NAME1
,A.TITLE
,C.DESCR
FROM PS_CUST_CONTACT A
,[linksrv].[prodDB].dbo.PS_BO_ROLE Z
,[linksrv].[prodDB].dbo.PS_RD_PERSON B
,[linksrv].[prodDB].dbo.PS_BO_ROLE_TYPE C
WHERE Z.BO_ID = B.BO_ID
AND Z.ROLE_TYPE_ID = C.ROLE_TYPE_ID
AND Z.ROLE_END_DT >= GETDATE()
AND A.EFFDT = (
    SELECT MAX(EFFDT)
    FROM PS_CUST_CONTACT CUST_CONTACT
    WHERE CUST_CONTACT.SETID = A.SETID
        AND CUST_CONTACT.CUST_ID = A.CUST_ID
        AND CUST_CONTACT.CNTCT_SEQ_NUM = A.CNTCT_SEQ_NUM
        AND CUST_CONTACT.EFFDT <= { FN CURDATE() }
    )
AND A.EFF_STATUS = 'A'
AND B.PERSON_ID IN (
    SELECT A1.PERSON_ID
    FROM PS_CONTACT A1
        ,PS_CONTACT_CUST B1
    WHERE A1.EFFDT = (
            SELECT MAX(A_ED.EFFDT)
            FROM PS_CONTACT A_ED
            WHERE A1.SETID = A_ED.SETID
                AND A1.CONTACT_ID = A_ED.CONTACT_ID
                AND A_ED.EFFDT <= SUBSTRING(CONVERT(CHAR, GETDATE(), 121), 1, 10)
            )
        AND A1.SETID = B1.SETID
        AND A1.CONTACT_ID = B1.CONTACT_ID
        AND B1.EFFDT = (
            SELECT MAX(B_ED.EFFDT)
            FROM PS_CONTACT_CUST B_ED
            WHERE B1.SETID = B_ED.SETID
                AND B1.CONTACT_ID = B_ED.CONTACT_ID
                AND B_ED.EFFDT <= A.EFFDT
            )
        AND A.CNTCT_SEQ_NUM = B1.CNTCT_SEQ_NUM
        AND A.SETID = B1.CUSTOMER_SETID
        AND A.CUST_ID = B1.CUST_ID
    )

enter image description here

Это было полезно?

Решение

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

Если вы можете запросить локальные данные без особых проблем, это будет лучше. Возможно, вы сможете восстановить производственное резервное копирование или использовать SSI (или даже BCP, он все еще работает) для копирования данных с сервера производства на некоторые рабочие таблицы на локальном сервере. Как правило, SSIS, BCP и аналогичная тактика быстрее, чем связанные серверы, и могут помочь избежать проблем с ростом файлов журнала.

Если вам необходимо запросить данные с удаленного сервера, вы можете обнаружить, что он переписывает запрос, чтобы он использовал OpenQuery () (а не имена из четырех частей) и «отправляет» все «удаленные части» запроса на Удаленный сервер, а затем присоединяется к результатам того, что к локальным данным будет более эффективным. Предполагается, что SQL будет достаточно умным, чтобы перемещать все соединения на удаленный сервер, но иногда это не так, а OpenQuery () дает вам метод, который вынуждает SQL, чтобы вы хотели, чтобы вы хотели.

Другая, аналогичная тактика - сначала запустить «удаленную часть» запроса и поместить результаты во временную таблицу, (необязательно) индексировать временную таблицу, а затем присоединиться к «локальной части» запроса во временную таблицу. Опять же, это помогает вам заставить SQL делать то, что должно быть.

Это звучит как больше работы, но SQL может вести себя более эффективно. Как всегда, следите за типами данных на объединениях, а ваши SARG или ваши индексы будут проигнорированы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top