Улучшает ли добавление явного столбца хэша SHA-256 для поля CLOB производительность поиска (точное совпадение) в этом поле CLOB

У нас есть требование реализовать таблицу (возможно, таблицу orable db или таблицу mssql db) следующим образом:

  1. В одном столбце хранится строковое значение, длина этого строкового значения сильно варьируется, обычно от нескольких байтов до 500 мегабайт (иногда более 1 гигабайта).
  2. Основываясь на вышеизложенном, мы решили использовать тип CLOB в db (использование системного файла как-то не вариант)
  3. Таблица очень большая, до нескольких миллионов записей.
  4. Одной из наиболее частых и важных операций с этой таблицей является поиск записей по этому столбцу CLOB, и строка поиска должна ТОЧНО соответствовать этому значению столбца CLOB.

Мой вопрос, помимо добавления индекса в столбец CLOB, нужно ли нам делать какую-то конкретную оптимизацию для повышения производительности поиска?

Один из членов моей команды предложил добавить дополнительный столбец, в котором можно вычислить хэш SHA-256 столбца CLOB выше и выполнить поиск по этому хеш-значению вместо столбца CLOB. По его мнению, основанием для этого является то, что хэш-значения имеют одинаковую длину, кроме переменной, поэтому индексация по ним ускоряет поиск.

Тем не менее, я не думаю, что этот способ имеет большое значение, потому что, если предположить, что добавление явного хэша улучшает производительность поиска, база данных должна быть достаточно умной, чтобы делать это самостоятельно, вероятно, сохраняя это хеш-значение в некоторых скрытых местах системы БД. Зачем нам, разработчикам, делать это явно, с другой стороны, это хеш-значение теоретически создает коллизию, хотя и редко.

Единственное преимущество, которое я могу себе представить, заключается в том, что когда клиентская сторона базы данных выполняет поиск по очень большому ключевому слову, вы можете уменьшить круговой обмен по сети, хэшируя это большое значение до значения небольшой длины, поэтому передача по сети происходит быстрее.

Так что любые гуру баз данных, пожалуйста, пролейте свет на этот вопрос. Большое спасибо!


person Bo Ye    schedule 13.12.2016    source источник
comment
Я ожидаю, что индексирование будет быстрее для значений переменной длины. Как вы думаете, почему одинаковая длина лучше?   -  person shmosel    schedule 13.12.2016
comment
Привет шмосель, спасибо за ответ. Я не знаю, какой из них быстрее, но мой товарищ по команде считает, что преимущества хеширования делают значения одинаковой длины и намного короче, чем исходные значения CLOB, поэтому индекс будет быстрее. Я тоже подозревал, что это неправда.   -  person Bo Ye    schedule 13.12.2016
comment
В зависимости от того, как реализованы строки, длина может быть первой линией защиты при отклонении потенциального совпадения. Строки фиксированной длины вынуждают индексатор начинать сравнивать их побуквенно.   -  person shmosel    schedule 13.12.2016
comment
Тем не менее, сетевые накладные расходы могут быть важным фактором, особенно если у вас есть объекты размером до 500 МБ.   -  person shmosel    schedule 13.12.2016
comment
Хорошие моменты! Шмосель, еще раз спасибо. Но при этом невозможность индексации поля CLOB, вероятно, делает хеширование более разумным.   -  person Bo Ye    schedule 14.12.2016


Ответы (1)


Обычные индексы не работают со столбцами CLOB. Вместо этого вам нужно будет создать индекс Oracle Text, который в первую очередь предназначен для полнотекстового поиска ключевых слов/фраз, а не для полнотекстового сопоставления.

Напротив, вычисляя хэш-функцию для данных столбца, вы можете затем создать индекс для хеш-значения, поскольку оно достаточно короткое, чтобы поместиться в стандартный столбец VARCHAR2 или RAW. Такая хеш-функция может значительно сократить пространство поиска при поиске точных совпадений.

Кроме того, ваше беспокойство по поводу коллизий хэшей, хотя и небезосновательное, может быть смягчено. Во-первых, коллизии хэшей относительно редки, но когда они происходят, документы вряд ли будут очень похожими, поэтому в ситуациях, когда обнаружена коллизия, можно использовать прямое сравнение текста. В качестве альтернативы из-за того, как работают хеш-функции, когда небольшие изменения в исходном документе приводят к значительным изменениям в хеш-значении, а одно и то же изменение в разных документах по-разному влияет на хэш-значение, вы можете вычислить вторичный хэш подмножества (или надмножества) исходного текста, который действует как механизм предотвращения коллизий.

person Sentinel    schedule 13.12.2016
comment
Привет Sentinel, большое спасибо за ответ. Это очень полезно. - person Bo Ye; 14.12.2016
comment
Мне интересно, что, если я не использую CLOB, вместо этого я использую VARCHAR2, для которого я устанавливаю большой предел длины. Делает ли этот способ хэширование этого VARCHAR2 бесполезным, поскольку я могу легко добавить индекс к VARCHAR2 независимо от того, насколько переменна длина этого поля? - person Bo Ye; 14.12.2016
comment
Что касается Oracle 11g, VARCHAR2 имеет ограничение в 4000 байтов в таблицах и SQL и 32768 байтов в PL/SQL, я считаю, что ограничения в таблицах и SQL были увеличены в 12c, но я не уверен в новых ограничениях, хотя все еще ‹= 32768. В то время как CLOB могут легко обрабатывать данные объемом в несколько ГБ. - person Sentinel; 14.12.2016
comment
Спасибо, Сентинел, это очень полезно. - person Bo Ye; 14.12.2016