Редактировать: Здесь Николас более точный ответ. У меня нет особого опыта работы с Sybase, но я заработал опыт работы с тонами данных с довольно маленьким сервером на Sql Server. Из этого опыта я узнаю, что, когда вы работаете с большим количеством данных, и на вашем сервере не хватает памяти для работы с этим объемом данных, вы столкнетесь с узкими местами (я думаю, что для написания временных результатов на диск). Я думаю, что это ваш случай (60 миллионов строк), но еще раз, я не знаю Sybase, и это зависит от многих факторов, как количество столбцов mytable и количество оперативной памяти вашего сервера и т. Д.
Вот результаты небольшого опыта, который я только что сделал:
Я запускаю на Sql-Server и PostgreSQL эти два запроса.
Запрос 1:
SELECT id, max(version)
FROM mytable
GROUP BY id
Запрос 2:
SELECT id, version
FROM
(
SELECT id, version, ROW_NUMBER() OVER (PARTITION BY id ORDER BY version DESC) as RN
FROM mytable
) q
WHERE q.rn = 1
В PostgreSQL, туЬаЫе имеет 2.878.441 строк.
Запрос № 1 занимает 31.458 секунд и возвращает 1.200.146 строк.
Запрос № 2 занимает 41.787 секунд и возвращает 1.200.146 строк.
На сервере Sql mytable имеет номера 1.600.010.
Запрос № 1 занимает 6 секунд и возвращает 537,232 строки.
Запрос №2 занимает 10 секунд и возвращает 537,232 строки.
До сих пор ваш запрос всегда был быстрее. Поэтому я попробовал на больших столах.
На PostgreSQL mytable теперь имеет 5,875.134 строк.
Запрос №1 занимает 100.915 секунд и возвращает 2.796.800 строк.
Запрос № 2 занимает 98.805 секунд и возвращает 2.796.800 строк.
На сервере Sql mytable имеет 11.712.606 строк.
Запрос №1 принимает 28 мин 28 сек и возвращает 6.262.778 строк.
Запрос №2 принимает 2 мин. 39 сек. и возвращает 6.262.778 строк.
Теперь мы можем сделать предположение. В первой части этого опыта. У двух серверов достаточно памяти для обработки данных, поэтому Group By работает быстрее. Вторая часть этого эксперимента может доказать, что слишком много данных убивают производительность группы. Чтобы предотвратить узкое место, ROW_NUMBER(), похоже, делает трюк.
Критика: У меня нет большой таблицы на PostgreSQL, и у меня нет сервера Sybase.
Для этого эксперимента я использовал PostgreSQL 9.3.5 на x86_64 и SQL Server 2012 - 11.0-2100.60 (X64)
Может Nicolas этот эксперимент поможет вам.
Спасибо за ваш ответ. Я забыл упомянуть, что в этой таблице уже есть кластеризованный индекс, и его сброс не является вариантом. Кроме того, создание индекса и статистика обновления не занимают меньше часа. –
@Nicolas. , , Я ничего не упоминал о кластеризованном индексе или опускании любого существующего индекса. –
"добавить индекс на mytable (id, version desc)" вы говорите о некластеризованном индексе? –