2015-03-06 3 views
1

У меня есть таблица базы данных Oracle LOG_MESSAGES с столбцом CLOB под названием MESSAGE. Некоторые из строк содержат то же самое MESSAGE.Count CLOB Дубликаты в большой таблице Oracle

Для каждого MESSAGE, который имеет хотя бы дубликат, мне бы хотелось узнать количество дубликатов. Довольно много таких CLOB огромны (> 100 kB), поэтому конвертировать в VARCHAR2 не может быть. Поскольку многие традиционные методы, такие как GROUP BY, не работают с CLOB, может кто-то, пожалуйста, просветить меня?

Для информации таблица очень большая (около 1 ТБ). Таким образом, оптимизированный метод очень ценится.

Заранее благодарю вас за помощь.

ответ

1

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

Поиск «группы clob by» или «clob distinct», и вы увидите несколько хитов только на этом веб-сайте.

Одним из способов было бы написать сценарий PL/SQL, который делает DBMS_LOB.COMPARE между всеми клобами в таблице, но эффективность, вероятно, будет в порядке O (n^2), что сделало бы ее очень медленной для вашей цели ,

Другой подход, который хорошо принят, заключается в том, чтобы взять хэш-значение clob, используя dbms_crypto (я думаю, что это позволяет хеширование на клобах), а затем группировать по хеш-значениям. Существует вероятность хеш-столкновения, но вероятность - минута. Я читал где-то около 2^80 (число может быть неправильным, хотя). Это будет не так медленно, как при первом подходе, но вычисление хеша также будет занимать не пренебрежимо малое время.

Я бы предложил сначала попробовать хэш-подход, и если это кажется слишком медленным, найдите альтернативы.

+0

У меня также возникла идея использовать 'DBMS_LOB.COMPARE' между всеми CLOB, но слишком много строк. Вот почему я стараюсь, чтобы стол был огромен. Был выбран второй подход, очень важна дополнительная информация о возможном столкновении. Спасибо за помощь! – Wil

3

dbms_crypto.hash может принимать CLOB и вычислять хэш. Затем вы можете группировать хэш. Конечно, вычисление хэша на большом CLOB будет дорогостоящим процессом с точки зрения потребления ЦП. Если у вас большое количество строк, это может занять некоторое время. Вы можете захотеть вычислить и сохранить хэш за один шаг и сделать GROUP BY на отдельном шаге.

+0

Спасибо за быстрый и полезный ответ! И рудван, и ваш ответ о «DBMS_LOB.HASH» очень хороши. Я пометил его за дополнительные детали. – Wil

Смежные вопросы