Как узнать, является ли строка частью индекса?

Я хочу найти, является ли строка частью индексированного столбца в postgresql.

Например: когда я открываю объект таблицы, я вижу свои индексы и кардинальность каждого индекса.

мое общее количество строк в таблице составляет 1 45 454, но мощность всех индексов составляет 1 45 300. Около 150 нечетных строк не проиндексированы ни в одном из созданных мной индексов.

Я выполнил приведенный ниже запрос, чтобы найти мощность,

SELECT relname, 
       relkind, 
       reltuples AS cardinality, 
       relpages 
FROM   pg_class 
WHERE  relname LIKE '%table_name%'; 

Может кто-нибудь объяснить, почему некоторые строки остаются частью индексации и как найти строки из 150 строк, которые не проиндексированы в моей исходной таблице.


person NMAK    schedule 13.05.2019    source источник
comment
Строки не индексируются. Колонки с другой стороны.   -  person Antoniossss    schedule 13.05.2019
comment
@Antoniossss Согласен, что это была моя ошибка в формулировке вопроса. Есть ли способ найти недостающие строки как часть index.   -  person NMAK    schedule 13.05.2019
comment
нет пропущенных строк. Это просто дублирующиеся записи индекса. Если хотите, GOUP BY индексируйте темы   -  person Antoniossss    schedule 13.05.2019


Ответы (2)


всего моих строк в таблице 1 45 454, но мощность всех индексов равна 1 45 300

это означает, что у вас есть 154 дублированных элемента индекса, поэтому некоторые из этих 154 элементов индекса (или меньше) указывают на более чем 1 строку (или более).

person Antoniossss    schedule 13.05.2019

Из документации postgres по статистике планировщика:

Из соображений эффективности reltuples и relpages не обновляются на лету, поэтому они обычно содержат несколько устаревшие значения. Они обновляются VACUUM, ANALYZE и несколькими командами DDL, такими как CREATE INDEX. Операция VACUUM или ANALYZE, которая не сканирует всю таблицу (как это обычно бывает), будет постепенно обновлять счетчик reltuples на основе просканированной части таблицы, в результате чего будет получено приблизительное значение. В любом случае планировщик масштабирует значения, которые он находит в pg_class, чтобы они соответствовали текущему физическому размеру таблицы, таким образом получая более близкое приближение.

Другими словами, пока это число приблизительно правильное, нет ничего плохого и не о чем беспокоиться. Если бы он был сильно выключен (скажем, "203" вместо его текущего значения), то пришло бы время выполнить задание VACUUM или ANALYZE для таблицы.

Также стоит проверить значение default_statistics_target< /а>. Если установить слишком низкое значение, ваша статистика будет становиться все менее и менее точной.

person jmelesky    schedule 13.05.2019