Для хранения 128-битного хеша: два bigints или двоичный (16)?
Я должен сохранить несколько миллионов 128-битных хеш-значений в базе данных, и я борюсь с дизайном моей таблицы.
Должен ли я хранить хэш в двух полях BIGINT или просто использовать BINARY(16)? Мой типичный пример использования - найти дубликаты записей на основе хеша.
Я мог бы просто использовать (с двумя bigints)
select * from hash where hash1=@hash1 and hash2=@hash2
или (с двоичным (16) столбцом)
select * from hash where hash=@hash
Имеет ли значение производительность?
Я использую MS SQL Server, но я не думаю, что это важно здесь. Тем не менее, я обращаюсь к MS SQL из программы на C#, и удобное чтение / запись значений предпочтительнее, но не нарушает условия сделки. В настоящее время у меня есть массив ulong.
2 ответа
Строка (255), 2 bigint или двоичный файл (16) запрашивают одну и ту же скорость, достаточную для того, чтобы использование любого из трех не изменило производительность настолько, чтобы это имело значение.
Два больших целых числа являются самыми быстрыми, но ненамного. Было рассчитано время тестирования 10 миллионов записей с использованием двух таблиц, одной с двумя bigint и одной с binary(16), и выполнением 1 миллиона случайных поисков. Bigint выиграл на 3%. Каждая таблица выполняла каждый запрос менее чем за 30 микросекунд. Стоимость преобразования двоичного (16) значения в 2 bigint, вероятно, съест часть этих 3%, поэтому придерживайтесь двоичного (16) в качестве естественного ключа.
Мне самому нужен был этот ответ, так как у меня была таблица строк (255), которую нужно было запросить. Я посмотрел на 2 подхода bigint и binary(16) для поиска. Поиск строки (255) также выполняется в пределах 2% от подхода bigint.
Скорее всего, вы будете выполнять полное сканирование таблицы в любом случае, мне кажется, имеет смысл использовать двоичный или varbinary и иметь индекс только для одного столбца.