План запроса T-SQL, который поможет выбрать наилучшую форму запроса?
-
18-09-2019 - |
Вопрос
У меня есть простая таблица регистрации данных с двумя столбцами данных A и B, для которых я хочу сгенерировать сумму A + B.Однако любой из A и B или оба A и B могут быть нулевыми.В таблице также есть столбец метки времени, который является первичным ключом
Я могу видеть несколько способов освежевать этого кота, но мне было любопытно узнать, каким может быть предпочтительный метод суммирования данных по диапазону временных меток:
1. SUM(Coalesce(A,0)+Coalesce(B,0))
2. SUM(Coalesce(A+B,A,B,0))
3. Coalesce( Sum(A), 0) + Coalesce( SUM(B), 0)
Я получаю следующие результаты от планировщика выполнения:
Form Select Compute Scalar Stream Aggregate Compute Scaler Clustered Index Seek 1 0% 0% 11% 1% 87% 2 0% 0% 11% 1% 87% Form Select Compute Scalar Compute Scaler Stream Aggregate Clustered Index Seek 3 0% 0% 0% 12% 88%
Я никогда раньше особо не вникал в планы запросов, поэтому не уверен, как интерпретировать цифры.Будет ли справедливо сказать, что в целом, чем больше смещен вправо общий процент искажения, тем лучше?Улучшаете ли форму 3 по сравнению с 1 и 2?
Решение
Оптимизируйте для ожидаемого случая.
Здесь, если и A, и B большую часть времени имеют значения, то # 2 должен работать лучше, потому что слияние достигнет этого первого значения и остановится.Если A или B очень часто имеют значение NULL, вы могли бы немного лучше использовать # 1.Ключевым моментом здесь, как всегда, является попробовать и то, и другое и спрофилировать фактическое время на основе фактических данных.