Сколько раз выполняется один и тот же ROUND и / или SUM, если используется в одном и том же запросе - PullRequest
1 голос
/ 21 мая 2019

БД - SQL Server 201x

Раздел кода ниже представляет собой измененное извлечение из тестового инструмента

У меня такой вопрос: насколько разумно во время выполнения выполнять те же самые секции ROUND (SUM (...))

Выполняет ли он первое вхождение и использует результат для последующих вхождений или выполняет его несколько раз.

Есть ли более разумный способ сделать это в SQL Server

select
    person.Name 'Name',
    account.AccountCode 'Account Code',
    ROUND(SUM(account.basevalue + account.accuredInteres), 2)    'Account Total'
    case 
        when ROUND(SUM(account.basevalue + account.accuredInteres), 2) =  ROUND(CAST(audit_data.total as decimal(21,6)), 2) then 'MATCH'
        when 
            ROUND(SUM(account.basevalue + account.accuredInteres), 2)  <= ROUND(CAST(audit_data.total as decimal(21,6)), 2) * 1.01 AND
            ROUND(SUM(faccount.basevalue + account.accuredInteres), 2)  >= ROUND(CAST(audit_data.total as decimal(21,6)), 2) * 0.99
            then 'IN TOLERENCE'
        else 'NOT MATCHING' END 'Values Equal ?'
from
    ----
    ----
where 
    ----

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Ответ зависит от плана выполнения.В этом случае я ожидаю, что round() будет выполняться 7 раз для каждой строки в наборе результатов.Однако обычно в запросе агрегации результирующий набор намного меньше, чем исходные данные, так что это, вероятно, добавляет небольшие накладные расходы к запросу.

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

Я не уверен, оптимизирует ли SQL Server несколько sum() или нет, но я сомневаюсь, что это сильно влияет напроизводительность.

0 голосов
/ 24 мая 2019

Единственный способ убедиться в этом - получить вычисленное поле ROUND (SUM (account.basevalue + account.accuredInteres), 2) как простое поле, а затем выполнить все сравнения на внешнем SQL-выборке, но это не лучше длявсе случаи подходят и могут быть неподходящими для вашего полного заявления.Однако вы можете попробовать его на большом наборе данных, чтобы увидеть планы и сроки выполнения.Я считаю, что дополнительные расходы будут минимальными.

...