Таблицы поиска Postgres по кластерным данным

Задний план

Это упрощенная версия базы данных postgres, которой я управляю:

TableA: id,name
TableB: id,id_a,prop1,prop2

Эта база данных имеет особенность: когда я выбираю данные, я рассматриваю только строки, TableBкоторые имеют одинаковые значения id_a. Поэтому мне никогда не интересно выбирать данные из id_a со смешанными значениями . Поэтому запросы всегда такие:SELECT something FROM TableB INNER JOIN TableA ON TableA.id=id_a

TableA

Некоторое время назад количество строк 20000выросло до TableBстрок и 10^7до TableBстрок.

Для первых запросов ускорения я добавил таблицу поиска двоичного дерева в свойства. Что-то вроде следующего: "my_index" btree (prop1)

TableB

Проблема

Теперь у меня есть my_index. новые данные и размер базы данных станут больше, чем двойной размер текущего размера. TableB, данные TableBстали слишком медленными.

Я понял, что медлительные имена из обновления my_index Когда я добавляю новую строку my_indexбазы данных, необходимо изменить порядок id_a таблицы поиска.

Я чувствую, что это ускорилось бы, если бы id_aне все элементы.

Но мне не нужна новая строка с заданным id_aсвойством для сортировки со строкой, имеющей другое id_aсвойство

Вопрос

Как создать индекс в таблице, CREATE INDEX partidx ON tableb ( prop1 ) WHERE id_a = 42 ; элементы упорядочиваются только тогда, когда они имеют одно и то же общее свойство (например, столбец, называемый )? INSERT

database,postgresql,

0

Ответов: 1


0

Вы не можете.

Вопрос, который я бы сразу спросил, хотите ли вы такой индекс: Да, но для каких значений WHEREвы хотите использовать индекс? И ваш ответ был бы «для всех из них».

Если вам действительно нужен индекс только для некоторых значений, вы можете использовать частичный индекс :

INSERT

Но на самом деле вам нужен индекс для всей таблицы.

Кроме того, это INSERTбудет так же медленно, если строка COMMITed не удовлетворяет WHEREусловию вашего индекса.

Для ускорения можно сделать три вещи INSERT:

  1. Запускайте как можно больше COMMITутверждений в одной транзакции, в идеале, все из них.

    Тогда вам не нужно платить цену за COPYкаждый сингл COPY, а COMMITs довольно дорогие: им нужно записывать данные на аппаратное обеспечение диска (а не в кеш), и это невероятно медленно (1 мс приличное время).

    Вы можете ускорить это, даже если вы используете подготовленные заявления . Таким образом INSERT, не нужно анализировать и готовить каждый раз.

  2. Используйте команду SQL COPYдля вставки многих строк. INSERTспециально разработан для импорта объемных данных и будет быстрее INSERT.

  3. Если COPYнужно замедлить работу, как правило, потому что вам нужно INSERTмного данных, самым простым способом является удаление всех индексов, вставка данных COPYи повторное создание индексов. Он может ускорить процесс на порядок, но, разумеется, база данных не полностью доступна, а индексы отбрасываются.

базы данных, PostgreSQL,
Похожие вопросы
Яндекс.Метрика