|
Навигация
|
Главная » Sql Использование хэш-ключей вместо строковых индексовИсточник: realcoding Моисеенко С.И. Вашему приложению может потребоваться индекс на основе длинной строки символов или, что еще хуже, конкатенации двух строк или строки и одного-двух целых чисел. Для небольшой таблицы вы можете не заметить какого-либо отрицательного влияния такого индекса. Но если предположить, что рассматриваемая таблица содержит 50 миллионов записей? Теперь вы не сможете не заметить воздействия, которое скажется как на требованиях к хранению, так и к производительности поиска.Однако вам не обязательно так поступать. Есть очень простая альтернатива, использующая то, что еще известно под названием хэш-блоков или хэш-ключей. Что такое хэширование? Говоря коротко, хэширование - это целочисленный результат алгоритма (известного как хэш-функция), применяемого к заданной строке. Вы передаете в алгоритм строку, а на выходе получаете целое число. Если Вы используете эффективную хэш-функцию, то вероятность того, что две различных строки дадут одно и то же значение хэш-функции, будет невелика. Такой случай известен под названием коллизии хэширования. Предположим, что Вы применили к этой статье алгоритм хэширования, затем изменили один символ в статье и повторили алгоритм: он возвратил бы другое целое число. Хэш-ключи в проекте базы данных Как бы теперь грамотно применить хэш-ключи в наших проектах баз данных? Предположим, что интересующая нас таблица имеет следующие столбцы:
Основной процесс состоит в следующем: Пользователь (либо человек, либо приложение) запрашивает некоторые значения. Эти значения теперь преобразовываются в хэш-ключ. Механизм базы данных выполняет поиск в индексе, построенном на хэш-столбце, возвращая требуемую строку, или небольшой набор соответствующих строк. В таблице с 50 миллионами строк, несомненно, будут возникать коллизии хэширования, но это не является проблемой. Возвращаемый набор строк будет значительно меньше, чем набор строк, которые пришлось бы запросить, чтобы найти точное совпадение с оригинальными поисковыми значениями. Вы локализуете небольшой набор строк, используя хэш-ключ, и затем выполняете сравнение на точное совпадение с каждой строкой из этого набора. Поиск, основанный на целочисленном столбце, может оказаться существенно быстрее, чем поиск на базе строкового ключа большой длины, и еще быстрее, чем для составного ключа. Алгоритмы хэширования, использующие функцию Checksum Есть несколько доступных алгоритмов, простейший из которых встроен в SQL Server в форме функции Checksum . Например, следующий запрос демонстрирует получение хэш-ключа для любого заданного значения или комбинации значений: USE AdventureWorks SELECT Name, GroupName, Checksum(Name,GroupName) AS HashKey FROM Adventureworks.HumanResources.Department ORDER BY HashKey Этот код приводит к следующему результату (для краткости показаны только 10 строк):
Используя этот метод, Вы могли бы решить проблему следующим образом, предполагая, что целью поиска являются значения в Name и GroupName : CREATE PROCEDURE DemoHash ( @Name Varchar(50), @GroupName Varchar(50) ) AS -- USE AdventureWorks DECLARE @id as int SET @id = Checksum(@Name,@GroupName) SELECT * FROM Adventureworks.HumanResources.Department WHERE HashKey = @id AND Name = @Name AND GroupName = @GroupName Заключение Этот подход может дать значительный прирост производительности, и я настоятельно советую вам протестировать этот метод на вашей собственной системе. Представленный метод предполагает, что поиск ограничивается одной таблицей, что может не всегда иметь место. Я пока еще экспериментирую со способами применения этой техники для поиска в соединенных таблицах, и когда я найду лучший подход, то дам вам знать. Arthur Fuller (оригинал: Intelligent Database Design Using Hash Keys) Перевод Моисеенко С.И. Заморочки от Oracle, или знать бы, где упасть…. JDataStore 7 (download). Политика Sybase по поддержке версий ПО. Будет ли повышаться зарплата ИТ-специалистов в будущем?. Наболевшее об исходном коде объектов БД. Главная » Sql |
© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено. |