↑↑↓↓←→←→ⒷⒶ Войти !bnw Сегодня Клубы
Че-то мне совсем разонравился постгрес. Планировщик — ебаное говно, которое расчитано на работу неоптимизированных запросов в неоптимизированной базе, которая хотя бы большими кусками помещается в оперативную память. Короче говоря — в распиздяйском окружении. А в условии ограниченных ресурсов все плохо. В итоге у меня на весь инстанс глобально стоит: enable_bitmapscan = off enable_hashjoin = off enable_mergejoin = off — просто чтобы избавиться от появляющихся зависших запросов, из-за которых пользователи отфутболиваются по таймауту. Простой пример: изобретаем мы электронную почту. Делаем таблицу messages (user_id, date, ...) Делаем индекс для нее по (user_id, date DESC) Каждому пользователю показываем 50 последних писем при помощи WHERE user_id = ... ORDER BY date DESC. Ничего фантастического, самое обычное поведение самого обычного приложения. Все работает очень быстро: делается index scan и nested loop 50 раз. Но только покудова мы одновременно не джоиним messages с какой-нибудь второстепенной хуетой. Тут планировщик начинает делать bitmap index scan, потом hash/merge join, а потом sort by date DESC. Беда в том, что писем у пользователя может быть 100 штук, а может быть 100 000 штук. Bitmap index scan в этом случае выбирает целый миллион, потом все это «быстро» и «эффективно» (как задумывалось планировщиком) джоинится, потом фильтруется лишнее (до 100 000 строк), потом сортируется, потом берутся верхние 50 писем. В результате пользователь со ста тысячами писем не может зайти в свой почтовый ящик вообще: он видит только nginx gateway timeout. И ситуации подобные этой возникают постоянно. Иногда запрос работает хорошо, но только меняется аргумент в условии — все идет пиздой. Например, планировщик, которого попросили письма двухнедельной давности, может решить, что теперь-то эффективнее делать bitmap index scan — и все по-новой. Обычная статистика не помогает, потому что, как я уже говорил, писем может быть и 100, и 100 000. Но в среднем — голубцы. CREATE STATISTICS еще не опробовал. Надеюсь, конечно, что поможет, но едва ли это очевидное решение. Хуй, блять, знает, какие исходники надо ковырять, чтобы сделать планировщик ПЕССИМЕСТИЧНЕЕ. Чтобы, блять, если в теории возможно, что план по выборке 50 обоссаных писем может закончится бедой — он не пользовался этим планом. Хинтов в постгресе нет. Есть возможность отключать отдельные виды тактик на время сессии, и, по-моему, даже во время транзакции. Вообще, все это хуйня, и через «еб твою мать!» с ней можно справиться. Но основной тренд очень расстраивает.
#0QMYCY / @komar / 1374 дня назад

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Tue Feb 09 2021 22:22:32 GMT+0100 (Central European Standard Time) Reply to #0QMYCY Clubs: Tags: эт ! protected by SuperBnW ( https://github.com/afwbkbc/superbnw ) ! Public key: https://github.com/afwbkbc/gpg/blob/master/5122E95DCC3CF31CE9F75D956AF7D685006F5088.asc -----BEGIN PGP SIGNATURE----- iQGzBAEBCgAdFiEEUSLpXcw88xzp912VavfWhQBvUIgFAmAi/RgACgkQavfWhQBv UIgDSQwAy2TI0jQrDsH9Ey9+cpJ4AsLZhswIg4XhfJX2wHgJwsy6QXtvLyt82E82 Eby1T0t6TFeO38gYgsxHlkSw3GVFxgMiupK9R71Cbm2espy98rtyokNgbchMMwyl Owfi/aw6qrs4IBKTaQbay0BgMr2zM+/jWPyuohkvcmozEIF6kIbJwr64FMIzz+ll xKvuka/YlYHJeQOqfq4UyrVsrXqMhr1f95LrxngSRA9X1lXUCDT0jGfIDxMFWEdo 093fJd3HVeDu1fSHSCxp0ANZWASznOaUL6A5+uVslK1QRSxsryRQc2Maa6qd8cvp EKiy9GfiFAlOJXKkqJhmFPFAle8LZYRGnMDh7ouZw5TOjceNddTQSFfu/UnFVkW1 vZY9hCiwAVyTJRcTv+ys/2uGDtMJsH9s6uEiOVhbpypEcHwb5VcXcVvS5fvmDJ7r RYaejA2Ua1lF5z+1FbodZkTuvxt6EkhxUzwljxNksaP86nxZhACEOGF1ZVAziE7g 3rlw/z+d =e5sG -----END PGP SIGNATURE-----
#0QMYCY/DON / @n / 1374 дня назад
сортируй последние 50 не по дате, а по rowid. индекс не понадобится
#0QMYCY/PBS / @anonymous / 1374 дня назад
@n съеби и не воняй
#0QMYCY/V0L / @anonymous --> #0QMYCY/DON / 1374 дня назад
@n как плешь, дырявый?
#0QMYCY/VOO / @anonymous --> #0QMYCY/DON / 1374 дня назад
>Простой пример: изобретаем мы электронную почту. И на этом примере ты отправляешься нахуй, потому что сообщения у нормальных людей хранятся в mailbox или maildir.
#0QMYCY/KC0 / @anonymous / 1374 дня назад

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

Думаю, тебе подойдёт решение с первой страницы поисковой системы: https://www.percona.com/blog/2007/04/06/using-delayed-join-to-optimize-count-and-limit-queries/

#0QMYCY/V1Y / @ceyt / 1374 дня назад
@ceyt Привет! Мне кажется, что у тебя уже терминальная стадия долбоебизма.
#0QMYCY/R4U / @komar --> #0QMYCY/V1Y / 1374 дня назад
@ceyt Бля, да отправлю я тебя в BL. Уже остоебило с тобой здороваться.
#0QMYCY/O8K / @komar --> #0QMYCY/V1Y / 1374 дня назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.