Разница в производительности date_trunc ('day', <timestamp>) против <timestamp>:: date - PullRequest
0 голосов
/ 03 июля 2019

Если я хочу сгруппировать столбец временных отметок, скажем registered_at по дню, в который они произошли, я могу использовать либо date_trunc('day', registered_at), либо registered_at::date. Первый удаляет часы и меньшие единицы из отметки времени, но все же возвращает отметку времени, а последний возвращает приведенную отметку времени к дате. Теперь мне интересно, имеет ли какой-либо из них лучшую производительность, чем другой.

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

-- SELECT date_trunc('day', registered_at)
Seq Scan on customers  (cost=0.00..5406.45 rows=23987 width=8) (actual time=0.023..46.811 rows=24436 loops=1)
  Filter: (created_at > '2019-06-01 00:00:00'::timestamp without time zone)
  Rows Removed by Filter: 113958
Planning time: 0.107 ms
Execution time: 48.158 ms

-- SELECT registered_at::date
Seq Scan on customers  (cost=0.00..5406.45 rows=23987 width=4) (actual time=0.017..34.353 rows=24436 loops=1)
  Filter: (created_at > '2019-06-01 00:00:00'::timestamp without time zone)
  Rows Removed by Filter: 113958
Planning time: 0.121 ms
Execution time: 35.548 ms

Кто-нибудь знает, какой метод будет быстрее, при усечении или при последующем использовании group by?

1 Ответ

0 голосов
/ 04 июля 2019

Если результат меняется, если вы запускаете тест несколько раз, это может быть проблемой кеширования.

Также всегда присутствует некоторый «случайный шум» во время выполнения запроса.

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

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