У меня есть следующая схема и 2 postgresql экземпляра с ведомым экземпляром, реплицирующим главный экземпляр.
CREATE TABLE t (id serial PRIMARY KEY, c text);
CREATE INDEX ON t (upper(c));
Я получаю этот неверный результат на ведомом экземпляре.
# SELECT id, c, upper(c), upper(c) = upper('FOO') FROM t WHERE id IN (123, 456);
id | c | upper | ?column?
-----+-----+-------+----------
123 | Foo | FOO | t
456 | foo | FOO | t
(2 rows)
# SELECT id, c, upper(c), upper(c) = upper('FOO') FROM t WHERE upper(c) = upper('FOO');
id | c | upper | ?column?
----+---+-------+----------
(0 rows)
Второй запрос должен возвращать те же строки, что и первый запрос.
Однако на главном экземпляре результат верен.
# SELECT id, c, upper(c), upper(c) = upper('FOO') FROM t WHERE id IN (123, 456);
id | c | upper | ?column?
-----+-----+-------+----------
123 | Foo | FOO | t
456 | foo | FOO | t
(2 rows)
# SELECT id, c, upper(c), upper(c) = upper('FOO') FROM t WHERE upper(c) = upper('FOO');
id | c | upper | ?column?
-----+-----+-------+----------
123 | Foo | FOO | t
456 | foo | FOO | t
(2 rows)
При использовании EXPLAIN во втором запросе я вижу что он использует индекс, как и ожидалось, поэтому я подозреваю, что данные индекса как-то неверны на ведомом экземпляре Выполнение REINDEX на главном экземпляре не решает проблему, а выполнение его на ведомом экземпляре невозможно из-за репликации.
Возможно ли, что данные индекса верны на главном экземпляре и неверны на рабский экземпляр? Как продолжить отладку проблемы?
ОБНОВЛЕНИЕ: Это план запроса второго запроса как на главном, так и на ведомом экземплярах
Index Scan using t_upper_idx on t (cost=0.43..8.46 rows=1 width=60)
Index Cond: (upper((c)::text) = 'FOO'::text)
В таблице t есть ~ 3M строк .
ОБНОВЛЕНИЕ: Версия сервера server 11.4 (Debian 11.4-1.pgdg90+1))
на главном и server 11.7 (Debian 11.7-0+deb10u1))
на ведомом.