SELECT count(*) AS total
FROM (SELECT *
FROM incoming
JOIN sync_devices ON incoming.device_id_int = sync_devices.device_id
WHERE incoming.demodulation_time >= '2020-07-23T16:54:37.840Z'
AND sync_devices.batch_id = 500
LIMIT 10000) AS query
В таблице sync_devices есть 500 записей с batch_id=500 и 3200 записей с batch_id=3200.
В таблице incoming ~18000 записей для join cо строками, содержащими batch_id=500. И больше 200000 записей для join со строками, содержащими batch_id=3200.
Планировщик использует Nested Loop для маленького джойна и Hash Join для большого джойна. В итоге, небольшое количество данных обрабатывается за 30 секунд, а в разы больший объем данных - за 700мс.
Подскажите в какую сторону копать, чтобы побороть эти тормоза на ровном месте?
LIMIT без ORDER BY — это не "ровное место", правда. Т.е. в чём вообще смысл этого запроса? А так — показали бы Вы планы, что ли...
Обсуждают сегодня