Медленно выполняемый запрос T- SQL с двумя объединениями к одной таблице - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь выяснить, что происходит с запросом T- SQL, показанным ниже.

Вы увидите два внутренних соединения в одной и той же таблице, хотя и с разными критериями соединения. Первое соединение само по себе выполняется примерно за 21 секунду, и если я запускаю второе соединение само по себе, оно завершается примерно через 27 секунд.

Если я оставлю оба соединения на месте, запрос будет запускаться и выполняться, пока я не остановлю запрос. Соответствующие индексы, похоже, на месте, и я знаю, что этот запрос выполняется в другой среде с меньшей мощностью, единственное отличие состоит в том, что на другом сервере запущен SQL Server 2012, а на моем компьютере SQL Server 2016, хотя база данных в режиме совместимости 2012:

Это объединение выполняется за ~ 21 секунду.

SELECT
    COUNT(*)
FROM 
    dbo.SPONSORSHIP as s
INNER JOIN 
    dbo.SPONSORSHIPTRANSACTION AS st 
        ON st.SPONSORSHIPCOMMITMENTID = s.SPONSORSHIPCOMMITMENTID
        AND st.TRANSACTIONSEQUENCE = (SELECT MIN(TRANSACTIONSEQUENCE)
                                      FROM dbo.SPONSORSHIPTRANSACTION AS ms
                                      WHERE ms.SPONSORSHIPCOMMITMENTID = s.SPONSORSHIPCOMMITMENTID
                                        AND ms.TARGETSPONSORSHIPID = s.ID)

Это объединение выполняется за ~ 27 секунд.

SELECT
    COUNT(*) 
FROM
    dbo.SPONSORSHIP AS s
INNER JOIN 
    dbo.SPONSORSHIPTRANSACTION AS lt ON lt.SPONSORSHIPCOMMITMENTID = s.SPONSORSHIPCOMMITMENTID 
        AND lt.TRANSACTIONSEQUENCE = (SELECT MAX(TRANSACTIONSEQUENCE) 
                                      FROM dbo.SPONSORSHIPTRANSACTION AS ms 
                                      WHERE ms.SPONSORSHIPCOMMITMENTID = s.SPONSORSHIPCOMMITMENTID 
                                        AND s.ID IN (ms.CONTEXTSPONSORSHIPID, 
                                                     ms.TARGETSPONSORSHIPID, 
                                                     ms.DECLINEDSPONSORSHIPID) 
                                        AND ms.ACTIONCODE <> 9)

1 Ответ

1 голос
/ 18 марта 2020

Оба они считаются коррелированными подзапросами . Как правило, вы должны избегать этого паттерна, так как он вызывает так называемый «RBAR» ... то есть «Row by Agonizing Row». Прежде чем сосредоточиться на устранении неполадок этого конкретного запроса, я бы предложил пересмотреть сам запрос и посмотреть, сможете ли вы решить эту проблему в подходе, основанном на множестве. Вы обнаружите, что в большинстве случаев у вас есть другие способы выполнить sh и резко сократить расходы.

В качестве одного примера:

select
    total_count
    ,row_sequence
from 
    ( 
    SELECT
    total_count = COUNT(*)
    ,row_sequence = row_number() over(order by st.TRANSACTIONSEQUENCE asc)
    FROM 
        dbo.SPONSORSHIP as s
    INNER JOIN dbo.SPONSORSHIPTRANSACTION AS st
    ON st.SPONSORSHIPCOMMITMENTID = s.SPONSORSHIPCOMMITMENTID
) as x
where
    x.row_sequence = 1

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

Приведенный мной пример показывает, что называется оконной функцией . Посмотрите больше на них, чтобы помочь с выбором результатов, когда вы видите последовательность слов, нуждаетесь в первом / последнем в группе и многое другое.

Надеюсь, это даст вам некоторые идеи! Добро пожаловать в переполнение стека! ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...