-
Notifications
You must be signed in to change notification settings - Fork 17
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Поиск в btree не возвращает результаты для mvarchar/mchar #6
Comments
Спасибо за подробный отчёт. |
Проверялось на двух вариантах
|
А вы пробовали нашу сборку с postgrespro.ru ? |
Да, использовал с вашего сайта postgres поддержкой 1с (https://postgrespro.ru/products/1c_build) |
Забыл добавить про локаль - везде была ru_RU.UTF-8 |
Проверил порядок сортировки для индекса и таблицы.
Результаты идентичные на тестовых данных. |
Так как вопрос не в сортировке, я решил посмотреть, какие данные в текстовом виде содержатся в проблемной странице индекса, куда попадает "Зё Г. В.".
Вывод результатов в файле page.txt. Максимальное значение на странице индекса должно находиться по смещению 1. В данном случае, это "ЗЕЙЛЕР Е. В.". Проверим функции сравнения класса оператора mvarchar этого наибольшего значения на странице с попавшим туда ключом "Зё Г. В." (вообще уже странно, ведь "ё" идет после "е").
Выходит полная ерунда, так как у функций сравнения отсутствует транзитивность |
Выходит, выстрелило не в значении "Зё Г. В.", а в наибольшем ключе на странице "ЗЕЙЛЕР Е. В." на котором ломаются функции сравнения. Этим и объясняется разница в поиске по таблице и индексу. В таблице идет полный перебор, и хоть наибольший ключ не проходит проверку (а "Зё Г. В." проходит) и мы получаем нужного нам "Зё Г. В.". А в индексе поиск не заходит в страницу, где лежит "Зё Г. В.", так как наибольший ключ не проходит проверку на условие сравнения |
Вот суть проблемы, если отбросить все ненужное
|
Все функции сравнения для case insensitive mvarchar/mchar под капотом используют
Могу ошибаться, но мне кажется, корни проблемы лежат в настройках сортировки colCaseInsensitive. Если посмотреть ее настройки из функции
В документации описано поведение данного уровня, которое до боли похоже на нашу проблему
По факту вместо |
Я проверил как сортируются "зё", "Зё Г. В." и "ЗЕЙЛЕР Е. В." в C, ICU и сравнил результаты с mvarchar.
Для проверки работы ICU полезна ссылка. В качестве вывода могу сказать, что проблема не в ICU (к счастью), а в реализации операторов сравнения mvarchar. |
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
2018-03-19 9:22 GMT+03:00 Denis Smirnov <[email protected]>:
Я проверил как сортируются "зё", "Зе Г. В." и "ЗЕЙЛЕР Е. В." в C, ICU и
сравнил результаты с mvarchar.
c: "ЗЕЙЛЕР Е. В." < "зё" < "Зе Г. В."
icu (secondary level): "зё" < "Зе Г. В." < "ЗЕЙЛЕР Е. В."
mvarchar: "зё" < "Зе Г. В." < "ЗЕЙЛЕР Е. В." < "зё"
Для проверки работы ICU полезна ссылка
<http://demo.icu-project.org/icu-bin/collation.html>. В качестве вывода
могу сказать, что проблема не в ICU (к счастью), а в реализации операторов
сравнения mvarchar.
Спасибо за анализ, было подозрение на все эти флаги.
… —
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#6 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGFI4r-Y_qQP9mFX4JwyWCcOvPz3osAwks5tf06ugaJpZM4Sre5j>
.
|
там все несколько хуже. Мы нашли вариант работающий во всех случаях - посимвольное сравнение с помощью ICU. Плата - скорость, создание индекса медленне на ~6%. Но, кажется, работает. |
Проверил, теперь сортировка работает корректно |
видимо, в середине мая, вместе с очередным минорным апдейтом |
Тестовая схема + данные
pg1c.sql.txt
Описание проблемы
В патче pg для работы с 1С наблюдается некорректное поведение при поиске в btree индексе поля типа mvarchar и mchar подстроки, содержащей букву "ё" (возможно, проблема более общая). На определенных наборах данных поиск в индексе не возвращает никаких результатов, хотя поиск по таблице успешно возвращает нужные строки (если скрыть индекс от планировщика тем же plantuner). При этом, если посмотреть индекс через pageinspect, то ключ, указывающий на искомую строку таблицы, в него успешно попадает (но не находится). Проблема проявляется на всех сборках postgresql с патчем 1С из репозитория postgres pro.
Воспроизведение бага
Инициализация базы
Ищем в индексе
Ищем в таблице
Проверим, что проблема не в like, но сохраняется и для поиска подстроки по диапазону (так переписывается план запроса вида "like" в индексе)
Ищем в индексе
Ищем в таблице
Итого
Версии
Ключ попадает не на ту страницу индекса
The text was updated successfully, but these errors were encountered: