2017-01-27 10 views
0

я анализирую код кого-то другого, и наткнулся на запрос, как это:Что делает GROUP BY на дату с +1 делать?

SELECT ... 
FROM ... 
GROUP BY date_field + 1 

В чем разница между этим запросом и один такой как следующий?

SELECT ... 
FROM ... 
GROUP BY date_field 

Если результат для обоих запросов одинаковый, отличаются ли они от производительности? Заранее спасибо.

+3

Просто попробуйте проверить выходные данные из разных запросов 'EXPLAIN SELECT ... FROM ... GROUP BY date_field' – Cyclonecode

+0

дополнительная операция, конечно, означает разницу. Но вы должны посмотреть на план выполнения, чтобы точно узнать, что такое стоимость +1. –

+0

Запрос +1 не соответствует требованиям ANSI SQL. – jarlh

ответ

1

Логически нет никакой разницы. Исходный код, вероятно, имеет что-то вроде:

select date_field + 1, . . . 
from . . . 
group by date_field + 1; 

group by ключа, то непосредственно соответствует выражению в select. Однако это необязательно. SQL поддерживает выражения в ключах group by, а + 1 не влияет на результат.

Это может влияет на план выполнения, однако. Я не слишком знакомы с двигателем оптимизации в Teradata, но две вещи приходят на ум:

  • Двигатель не может признать, что он может использовать индекс date_field.
  • Двигатель может запутаться в статистике для столбца агрегации, выбирая алгоритм субоптимальной агрегации.
+0

Я упростил проблему ради вопроса, но да, у нее есть те же операции, что и на date_field в SELECT и в GROUP BY (на самом деле add_months (date_field + 1, 1) -1, чтобы он мог получить последний день следующего месяца, когда date_field - последний день месяца). Результаты те же, план выполнения не показывает существенных изменений, и время выполнения запроса одинаково. Думаю, этот ответ имеет высокую вероятность быть правым, поэтому я соглашусь с этим. – user20085