Мне кажется, что селективность idterminal достаточно низкая, чтобы Postgres мог выбрать полное сканирование mytable_pkey
, а не стоимость заказа всех строк с idterminal = 233463
Я предлагаю:
CREATE INDEX idx_idterminal2 ON mytable USING btree (idterminal, idpos);
и, возможно:
DROP INDEX idx_idterminal;
Вы не упоминаете, является ли это производственной базой данных или нет - если это, конечно, вам нужно сначала проверить влияние изменения в другом месте.
Если вы предпочитаете не менять схему, вы можете попытаться обмануть оптимизатор по пути, который, как вы знаете, лучше всего подходит для чего-то вроде (не проверено) для 8.4 и выше:
SELECT *
FROM ( SELECT tpostime, gispoint, idpos, row_number() over (order by 1)
FROM mytable
WHERE idterminal = 233463 )
ORDER BY idpos DESC;
или, может быть, просто:
SELECT *
FROM ( SELECT tpostime, gispoint, idpos
FROM mytable
WHERE idterminal = 233463
GROUP BY tpostime, gispoint, idpos )
ORDER BY idpos DESC;
или даже:
SELECT tpostime, gispoint
FROM mytable
WHERE idterminal = 233463
ORDER BY idpos*2 DESC