нужно так:
SELECT
dstnum AS t2dstnum,
MAX(calldate) AS t2lastcall
FROM cdr
WHERE route = "out"
GROUP BY dstnum
аналитика здесь не нужна, только агрегатная функция с группировкой. В итоге, при прохождении таблицы мы не собираем дубликаты, а берем только нужные строки. Иначе, будет создана временная таблица со множеством ненужных дубликатов, на удаление которых у DISTINCT уйдет время. Судя по работе запроса, в PostgreSQL оптимизатор сам догадывается что нужно сделать именно так, в MySQL нужно задавать явно.