Re[2]: hex string to binint [postgres]
От: fizz  
Дата: 18.04.12 09:30
Оценка:
Здравствуйте, maxkar, Вы писали:

M>Здравствуйте, Аноним, Вы писали:


А>>Нужно перевести строку вида "0fad933379d52044" в int (bigint). Средствами базы данных.

А>>Желательно без сложной хранимой процедуры....
M>Без хранимки не получится. В стандартных строковых функциях ничего полезного нет. Так что что-нибудь написать придется. Просуммировать коды символов с коэффициентами, например. Может быть (если архитектура позволяет) вообще вычислять на стороне клиента а не базы.

А>>По идее субд должна бы сама деелать эффективный хеш, и искать строку так же быстро как и int8, но по каким-то причинам этого не делает.

M>А у вас индекс то как создан? Хэшированный или обычный BTree? Если вдруг решите использовать хэш-индекс, внимательно читайте документацию. Вроде бы есть какие-то неочевидные ограничения и подводные камни.

А>>Посоветуйте или как правильно отиндексировать табличку, или способ как мне из md5(some_txt_key) получить int8.

M>explain analyze для вашего запроса покажите (или хотя бы обычный explain). Может, селективность индекса плохая получается. Или он не анализируется/не обновляется статистика. Эти две причины приведут к тому, что индекс не используется. Или ваши 150 символов приходится в индекс с диска таскать часто, например.

M>Можете для вашего md5 посчитать какой-нибудь crc восьмибитный. Но лучше бы crc считать по исходным данным либо по бинарному представлению md5, а не по его текстовому представлению (текстовое представление распределено "плохо").



select ('x' || '0fad933379d52044')::bit(64)::int8
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.