Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Пустой результат Select при использовании индексов  [new]
DarthGelos
Member

Откуда:
Сообщений: 26
Доброго дня.
Просьба подсказать, куда стоит влезть и проверить:
Исходная позиция:
Мастер: PostgreSQL 11.12
Таблица с индексом:
CREATE UNIQUE INDEX seller_shop_id_full_name_uindex ON public.seller USING btree (shop_id, full_name)
Слейв 1: PostgreSQL 11.12
Слейв 2: PostgreSQL 11.13


Запрос: select * from seller where shop_id=354 and full_name = 'Москалёв Сергей Викторович';
На мастере выдает результат:
id | full_name | personnel_number | shop_id
---------+----------------------------+------------------+---------
2491002 | Москалёв Сергей Викторович | | 354
План запроса:
QUERY PLAN
-----------------------------------------------------------------------------------------------
Index Scan using seller_shop_id_full_name_uindex on seller (cost=0.41..2.63 rows=1 width=64)
Index Cond: ((shop_id = 354) AND ((full_name)::text = 'Москалёв Сергей Викторович'::text))

На слейве 1: PostgreSQL 11.12
тот же запрос select * from seller where shop_id=354 and full_name = 'Москалёв Сергей Викторович';
id | full_name | personnel_number | shop_id
---------+----------------------------+------------------+---------
2491002 | Москалёв Сергей Викторович | | 354

План запроса:
QUERY PLAN
-----------------------------------------------------------------------------------------------
Index Scan using seller_shop_id_full_name_uindex on seller (cost=0.41..2.63 rows=1 width=64)
Index Cond: ((shop_id = 354) AND ((full_name)::text = 'Москалёв Сергей Викторович'::text))

А вот на слейве 2 PostgreSQL 11.13 тот же запрос select * from seller where shop_id=354 and full_name = 'Москалёв Сергей Викторович'; выдает пустой результат
id | full_name | personnel_number | shop_id
----+-----------+------------------+---------
(0 строк)
QUERY PLAN
-----------------------------------------------------------------------------------------------
Index Scan using seller_shop_id_full_name_uindex on seller (cost=0.41..8.43 rows=1 width=64)
Index Cond: ((shop_id = 354) AND ((full_name)::text = 'Москалёв Сергей Викторович'::text))

Если убрать индекс seller_shop_id_full_name_uindex, все начинает работать. С ним работает только на мастере и 1 слейве.
Причем, если убрать условие и выполнить запрос на слейве 2 select * from seller where full_name = 'Москалёв Сергей Викторович'; будет результат
id | full_name | personnel_number | shop_id
---------+----------------------------+------------------+---------
2491002 | Москалёв Сергей Викторович | | 354


Есть предположение что дело либо в различии минорных версий, но это дикость была бы..
Либо есть какой то параметр на слейв 2, которые как то влияет на поиск..
Порядком голову уже сломал.
Реиндекс и vacuum analyze не помог.
Пересоздание фамилии в ту же строчку тоже не помогла.
Только если удалить индекс составной, тогда работает, но этот индекс нужен обязательно, да и на 1 слейве с ним работает...
27 окт 21, 14:21    [22388800]     Ответить | Цитировать Сообщить модератору
 Re: Пустой результат Select при использовании индексов  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1391
DarthGelos,

Версии libc проверьте.
https://wiki.postgresql.org/wiki/Locale_data_changes
27 окт 21, 14:41    [22388824]     Ответить | Цитировать Сообщить модератору
 Re: Пустой результат Select при использовании индексов  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 5022
DarthGelos,

Версии OS/libc разные скорее всего... так работать не будет.
https://wiki.postgresql.org/wiki/Locale_data_changes

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
27 окт 21, 15:21    [22388863]     Ответить | Цитировать Сообщить модератору
 Re: Пустой результат Select при использовании индексов  [new]
DarthGelos
Member

Откуда:
Сообщений: 26
Похоже что да.
Там версии ОС разные на мастере и 1 слейве одна, на 2 слейве другая.
Проверка ( echo "1-1"; echo "11" ) | LC_COLLATE=en_US.UTF-8 sort
на мастере и 1 слейве выдает:
11
1-1
А на втором слейве
1-1
11
:(
Я только не понял, как это с наличием/отсутствием индекса связано. Сами индексы некорректно работают из-за версии libc?
27 окт 21, 15:28    [22388876]     Ответить | Цитировать Сообщить модератору
 Re: Пустой результат Select при использовании индексов  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1391
DarthGelos,

представьте себе отсортированное множество. Если вы, используя одну функцию сравнения, пишете данные в одно место, логичное для этой функции сортировки, а вот при чтении пользуетесь другой функцией сравнения, которая говорит что искомые данные нужно искать в другом месте - то вы не найдёте те ранее записанные данные. С точки зрения новой функции сортировки данные записаны в неверном порядке и из-за этого закономерно ломается алгоритм поиска.
27 окт 21, 15:41    [22388888]     Ответить | Цитировать Сообщить модератору
 Re: Пустой результат Select при использовании индексов  [new]
DarthGelos
Member

Откуда:
Сообщений: 26
Melkij,

ясно.. лечить это болячку лучше приведением версии ОС к одному виду?
27 окт 21, 15:46    [22388896]     Ответить | Цитировать Сообщить модератору
 Re: Пустой результат Select при использовании индексов  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1391
DarthGelos,

да
27 окт 21, 16:11    [22388932]     Ответить | Цитировать Сообщить модератору
 Re: Пустой результат Select при использовании индексов  [new]
DarthGelos
Member

Откуда:
Сообщений: 26
Melkij, спасибо, помогло, все заработало
9 ноя 21, 15:13    [22393689]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить