Oracle SQL пытается Ха sh 25 столбцов в одном столбце - PullRequest
1 голос
/ 10 марта 2020

Поэтому, когда я пытался получить sh 25 столбцов с помощью функции ORA_HA SH, я получал ошибку: слишком много параметров. Есть ли способ, которым мы можем sh все 25 столбцов и быстро, потому что у нас есть около 60 миллионов строк и нет даты обновления :(

select  ORA_HASH
  (id,name,c....,...) form table name 

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Конечно, ваша конечная цель - не получить га sh? Для чего ха sh? Вполне возможно, что это не правильный путь для достижения вашей цели.

Во-вторых, ORA_HASH - это слабый 32-битный га sh, который вызовет столкновение га sh на каждые 25 000 строк! Я написал об этом целый пост в блоге, см .:

https://stewashton.wordpress.com/2014/02/15/compare-and-sync-tables-dbms_comparison/

В-третьих, начиная с версии 12 c, есть функция STANDARD_HASH, которая выглядит выполнять довольно хорошо, и это идет до 512 бит! (не в байтах, как я сказал перед редактированием этого ответа ...)

Наконец, правильный путь к ха sh нескольким вещам - это "ха sh цепочка", а не объединение значений. ORA_HASH, кажется, поддерживает цепочку ha sh (или что-то подобное), используя третий параметр:

ora_hash(column1, 4294967295, ora_hash(column2))

С STANDARD_HASH я сначала использовал бы его для каждого столбца индивидуально, а затем использовал UTL_RAW.CONCAT для объединения результатов, затем либо используйте STANDARD_HASH для объединенного результата, либо просто используйте объединенное значение, как если бы оно было большим ха sh.

0 голосов
/ 10 марта 2020

Используйте конкатенацию с какой-то специальной строкой в ​​качестве разделителя, например, здесь chr (10), предполагая, что этот устав не отображается в ваших данных

 col1||chr(10)||col1||....

Будьте осторожны с цифрами c и столбцами данных.

Либо преобразуйте их явно в символьных столбцах, например,

...||to_char(col_date,'yyyy-mm-dd hh24:mi:ss')||... 

, либо переопределите временную настройку сеанса, чтобы иметь постоянные значения

 ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.']';
 ALTER SESSION SET NLS_DATE_FORMAT = 'DD.MM.YYYY HH24:MI:SS';

Проблема с настройкой NLS заключается в том, когда они измените и выполните преобразование по умолчанию в символьную строку - вы получите другой код ha sh.

Обратите также внимание, что ORA_HA SH может привести к дублированию, например, код MD5 ha sh распознавать изменения в данных таблицы.

Заключительная нота Oracle имеет (не очень известную) функцию DBMS_SQLHA SH .GETHA SH, что может или не может быть тем, что вы ищем.

...