Как обрабатывать обновления / вставки таблицы, если на таблице есть индекс
Привет, я немного запутался в обработке индексов в postgres. Я использую версию 9.6. Из моего понимания после прочтения постгрес документов и ответов от stackru я хочу проверить следующее:
- Postgres не поддерживает индексы с классическим понятием
- все индексы в postgres являются некластеризованными
- indexes не выделяет никакого нового пространства, но применяет сортировку к таблице, поэтому после создания индекса должна следовать команда CLUSTER.
- в документации указано, что после обновления / вставки в таблицу индекс обновляется автоматически
Покажите, я создал таблицу с col1,col2,col3,col4 и индексом, основанным на col2, col3. Выборы, связанные с col2, col3 стали в 15 раз быстрее. Когда я выполняю команду select * from table, результаты отображаются сначала отсортированными по столбцу col2, а затем по столбцу col3.
Когда я добавляю новую строку в таблицу (с уже существующим значением col2 (test_value)), эта строка помещается в конец таблицы (это было проверено с помощью: select * from table).
1) Был ли индекс обновлен этой новой записью автоматически, даже если в строке "Выбрать все" была показана строка в конце?
2) Если выполнить запрос будут все строки, которые имеют test_value на col2, что произойдет? Получу ли я все результаты через индекс?
1 ответ
Здесь есть некоторые неправильные предположения.
Наиболее важным является то, что: порядок строк в выборке является неопределенным, если вы не включите ORDER BY
, Таким образом, вы можете получить любой результат. ДБ решит, что это более быстрый способ получить данные. Так что если select * from table
вернуть последний вставленный элемент в конце, который ничего не говорит об индексе.
Как хранятся строки и информация индекса - это разные вещи
1) Да, индекс был обновлен после вставки.
2) Да, потому что индекс уже обновлен.