Как понять / отладить неверный результат индекса на ведомом экземпляре - PullRequest
0 голосов
/ 26 марта 2020

У меня есть следующая схема и 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)) на ведомом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...