Ответы пользователя по тегу PostgreSQL
  • Как ускорить Postgresql Index Scan?

    @TestVDK Автор вопроса
    Здравствуйте, извините за задержку:
    lesovsky:
    1) Индексы по искомому полю есть, сейчас не могу показать - пересоздаю индекс после vacuum full
    2) ошибку выдает такая команда((
    3) Такие диски: www.hetzner.de/en/hosting/produkte_rootserver/ex60 - по поводу sar - не умею им пользоваться, сейчас не установлено

    Timosha:
    1) Строки я итак беру не все, использую сначала limit 5, потом постранично limit 15 offset ...
    2) Даже при выборе select field from table where field=12345678, присутствует Index Only Scan вместо Scan - но все равно поиск долгий, и близко не мгновенный
    3) См пункт 2.
    4) Буду смотреть документацию по CLUSTER. Есть еще одно поле в таблице аналогичное искомому, с ним ситуация похожая (также нужна выборка по этому полю). Если не затруднит опишите вкратце преимущества CLUSTER.
    5) К сожалению таблица растет постоянно, имеется до 10 миллионов уникальных значений field и строки для каждого field непрерывно увеличивается, хочется выдавать пользователям моментально информацию по любому значению, ведь для этого я индекс создавал!

    P.S. shared_buffers сколько ставить, у меня сейчас несколько GB (не помню сколько точно), а всего памяти на машине 48GB

    P.P.S я месяц держал таблицу, постепенно увеличивал объем, REINDEX и VACUUM вообще не делал
    Данные равномерно прибывают и вообще не удаляются (99% INSERT 1% UPDATE)

    Буду рад любым рекомендациям и направлениям развития)

    ОБНОВЛЕНО
    Я сделал VACUUM FULL и DROP/CREATE INDEX - теперь доступ к произвольному значению player_id занимает не больше 2 секунд, но это все равно много. Повторный доступ к player_id, запрашиваемому ранее занимает уже 0.5мс (сидит в shared_buffers).

    Timosha:
    1) Я немного неправильно написал. У меня в таблице 400кк строк. У них около 10кк разных значений поля player_id. Я делаю запросы вида "select * from table where player_id=123456789 limit 50 offset 150". Здесь основная нагрузка идет на условие where потому при фильтре условием where player_id=123456789 остается максимум 5-10к строк.
    2) Основная проблемная таблица participates. Relation_size - 36gb, Total_relation_size - 71gb, Имеется 4 btree индекса по Integer колонкам. Все колонки в таблице - integer 2-4 бита (по необходимости).
    4) Следующим шагом проведу кластеризацию
    5) Увеличил до 16gb - проверю после перезагрузки

    Timosha:
    Сначала попробую кластеризацию а потом вариант с частичным индексом

    lesovsky:
    размеры индексов в предыдущем блоке
    с оффсетами проблем нет
    ранее с этим сталкивался - сделал промежуточную таблицу с результатами order через row_select - получились целые номера - позиции строк и теперь вместо limit 150 offset 1500 делают where between 1500 and 1650 - очень помогло
    Ответ написан