2016-12-13 4 views
1

У нас есть требование реализовать таблицу (возможно, таблицу dable или таблицу mssql db) как следующим образом:Добавление явного столбца хеша SHA-256 для поля CLOB улучшает производительность поиска (точное совпадение) в этом поле CLOB

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

Вопрос, помимо добавления индекса на столбец CLOB, нужно ли нам делать определенную оптимизацию для улучшения эффективности поиска?

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

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

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

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

+1

Я ожидал бы, что индексирование будет быстрее по значениям переменной длины. Почему вы думаете, что равная длина лучше? – shmosel

+0

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

+1

В зависимости от того, как реализованы строки, длина может быть первой строкой защиты при отказе от потенциального соответствия. Строки фиксированной длины заставляют индексатор начинать сравнивать их буквой. – shmosel

ответ

1

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

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

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

+0

Привет, Sentinel, большое спасибо за ответ. Это очень полезно. –

+0

Мне интересно, что делать, если я не использую CLOB, вместо этого я использую VARCHAR2, на котором я устанавливаю ограничение большой длины. Разве этот способ делает хэширование против этого VARCHAR2 бесполезным, поскольку я легко могу добавить индекс на VARCHAR2 независимо от того, как это поле является переменной? –

+1

Начиная с Oracle 11g VARCHAR2 имеет предел 4000 байтов в таблицах и SQL и 32768 байт в PL/SQL, я считаю, что ограничения в таблицах и SQL были увеличены в 12c, но я не уверен в новых ограничениях, хотя все еще <= 32768. В то время как CLOB могут легко обрабатывать данные с объемом в несколько ГБ. – Sentinel