Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM? Задача Требуется периодически синхронизировать данные в двух больших таблицах, расположенных на разных SQL-серверах. Таблица-источник расположена на SQL-сервере IBM DB2, таблица-приёмник – на MS SQL 2000. В момент каждой синхронизации отличия между таблицами весьма небольшие. Необходимо провести синхронизацию, не перекачивая полностью все данные. Узким местом является именно передача данных. Оба SQL-сервера работают достаточно шустро. Таблица-источник не имеет уникального ключа/индекса, изменить её структуру нельзя. Изменения в данных источника могут касаться любого поля таблицы, предсказать их заранее также практически невозможно. Предполагаемый способ решения Синхронизация производится путём применения SQL-запроса на MS SQL 2000, содержащего обращение к связанному SQL-серверу DB2. Данные в запросе к таблице могут быть сгруппированы по какому-нибудь полю, например - дате. Требуется вычислить хэш для каждого подмножества строк, относящегося к каждой дате на источнике и приёмнике и сравнить хэши. Если хэши различаются – то обновляются только записи, касающиеся только этой даты. Проблема Как вычислить качественный агрегатный хэш средствами стандартного SQL так, чтобы его значения для одинаковых входных подмножеств совпадали на DB2 и MS SQL? Пока я использую простое суммирование функцией SUM (с переполнением) для некоторых числовых полей. Это работает (и притом довольно быстро), хотя и не выглядит в моих глазах достаточно надёжным. Для страховки я собираюсь после синхронизации выполнять в обеих таблицах суммирование по одному из числовых полей и, если суммы не сойдутся, – выполнять полное копирование. Дополнение Я знаю о семействе функций CHECKSUM_AGG, CHECKSUM и BINARY_CHECKSUM на MS SQL 2000. К сожалению, мне не известны аналоги в DB2, да и само их качество (в частности CHECKSUM_AGG) представляется недостаточным. Слишком часто возвращаются одинаковые хэши для разных входных множеств. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.12.2008, 13:49 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
1) Данные параллельно меняются в 2 системах? 2) Если нет то зачем городить огород. например в DB2 есть таблица X настраиваем репликацию из таблицы X в таблицу XR. Реплицируем только измененные данные. периодически забираем из таблицы XR данные в MS-SQL X после того как забрали данные удаляем все из таблицы XR ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 08:23 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Данные меняются только в одной таблице-источнике на сервере DB2. Ничего настроить или тем более стирать на сервере DB2 нельзя. Можно только читать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 09:31 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Весь огород городится для того, чтобы не перекачивать все данные из таблицы-источника при синхронизации. Для того чтобы определить изменившееся подмножество(а) в источнике считаем по ним хэши и сравниваем на источнике и приёмнике. Вопрос был об агрегатной хэш-функции реализуемой стандартными средствами SQL DB2 непосредственно в строке запроса. Без применения пользовательских переменных, функций и процедур. Далее. Аналог этой хэш-функции должен быть реализуем на MS SQL 2000. Какими угодно средствами - COM, T-SQL, расширенные ХП и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 09:48 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
xze321) Данные параллельно меняются в 2 системах? 2) Если нет то зачем городить огород. например в DB2 есть таблица X настраиваем репликацию из таблицы X в таблицу XR. Реплицируем только измененные данные. периодически забираем из таблицы XR данные в MS-SQL X после того как забрали данные удаляем все из таблицы XR Предложенный Вами вариант конечно здравый, спасибо за ответ. К сожалению, он неприменим в настоящее время в моей ситуации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 09:53 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Кстати, будет ли отслеживаться при репликации изменений удаление записей в таблице-источнике? Каким образом? Количество записей в таблице-источнике не фиксировано. Страрые удаляются, новые добавляются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 10:57 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Ghola Вопрос был об агрегатной хэш-функции реализуемой стандартными средствами SQL DB2 непосредственно в строке запроса. Без применения пользовательских переменных, функций и процедур. Далее. Аналог этой хэш-функции должен быть реализуем на MS SQL 2000. Какими угодно средствами - COM, T-SQL, расширенные ХП и т.п. Интересно получается. На DB2 ничего своего делать нельзя, а на MS SQL можно. Посмотрите статистические функции, типа AVG, STDDEV, CORRELATION. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 12:41 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
А поймать изменения capture-ом в CD-таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 12:54 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
gals, спасибо за ответ! galsGhola Вопрос был об агрегатной хэш-функции реализуемой стандартными средствами SQL DB2 непосредственно в строке запроса. Без применения пользовательских переменных, функций и процедур. Далее. Аналог этой хэш-функции должен быть реализуем на MS SQL 2000. Какими угодно средствами - COM, T-SQL, расширенные ХП и т.п. Интересно получается. На DB2 ничего своего делать нельзя, а на MS SQL можно. Угу. Именно так. galsПосмотрите статистические функции, типа AVG, STDDEV, CORRELATION. Смотрел, они возвращают значения с плавающей точкой, которые, в отличие от SUM, часто не совпадают для MS SQL и DB2, при одинаковых входных множествах. Значения полей в таблице-источнике типов CHARACTER, NUMERIC и DECIMAL. Т.е. пригодные для целочисленной арифметики. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 12:59 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
тогда хэш будет select count(*) where data='data', из CD-таблицы. если count(*) и select sum(0) from что - нибудь на Microsoft sql server ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 13:00 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
zz..zz..zzА поймать изменения capture-ом в CD-таблицы? Поясните свою мысль, плиз. Мне это непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 13:02 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Gholazz..zz..zzА поймать изменения capture-ом в CD-таблицы? Поясните свою мысль, плиз. Мне это непонятно. ну есть же стандартный механизм в репликации в DB2, он работает примерно так 1 изменения пишутся в transaction log 2 программа capture читает transaction log и пишит изменения в так называемые CD-таблицы 3 программа apply читает CD-таблицы и применяет изменения где-нибудь на другой базе потом CD-таблицы чистятся. ничто же не мешает брать изменения прямо из CD-таблиц, а потом самому их чистить. вот если в СD-таблицах что-то есть, значит это и нужно применять на Microsoft SQL Server ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 13:08 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
zz..zz..zz..zzтогда хэш будет select count(*) where data='data', из CD-таблицы. если count(*) и select sum(0) from что - нибудь на Microsoft sql server Скажите пожалуйста, что такое "CD-таблица"? Количество записей, относящихся к каждой дате я и так считаю и сравниваю, но считаю это недостаточным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 13:08 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Gholazz..zz..zz..zzтогда хэш будет select count(*) where data='data', из CD-таблицы. если count(*) и select sum(0) from что - нибудь на Microsoft sql server Скажите пожалуйста, что такое "CD-таблица"? Количество записей, относящихся к каждой дате я и так считаю и сравниваю, но считаю это недостаточным. это специалная таблица которая используется механизмом репликации DB2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 13:12 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
zz..zz..zz..zzGholazz..zz..zzА поймать изменения capture-ом в CD-таблицы? Поясните свою мысль, плиз. Мне это непонятно. ну есть же стандартный механизм в репликации в DB2, он работает примерно так 1 изменения пишутся в transaction log 2 программа capture читает transaction log и пишит изменения в так называемые CD-таблицы 3 программа apply читает CD-таблицы и применяет изменения где-нибудь на другой базе потом CD-таблицы чистятся. ничто же не мешает брать изменения прямо из CD-таблиц, а потом самому их чистить. вот если в СD-таблицах что-то есть, значит это и нужно применять на Microsoft SQL Server Спасибо за разъяснения, уже понятнее. Но не вполне. :) Уточните, это справедливо для какой платформы? (ОС). К тому же, Вы, вероятно, имеете в виду так или иначе механизм репликации, не так ли? Боюсь, что у нас он не настроен. И не будет настроен в обозримом будущем. Позволяет ли отслеживать такой механизм добавление и, самое главное, удаление, а не только изменение существующих записей в таблице-источнике? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 13:17 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Ghola, Триггеры на db2-таблицу можно повесить, которые смогут в вашу служебную таблицу писАть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 14:38 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Mark BarinsteinGhola, Триггеры на db2-таблицу можно повесить, которые смогут в вашу служебную таблицу писАть?Увы-увы... Нельзя. На DB2 я могу только читать. Ни создавать триггеры ни процедуры ни функции. Ни переменные. К тому же триггеры понизят производительность БД при изменениях в таблице-источнике, а это крайне неприветствуется. Хотя замедление должно быть несущественно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 14:50 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Gholazz..zz..zz..zzGholazz..zz..zzА поймать изменения capture-ом в CD-таблицы? Поясните свою мысль, плиз. Мне это непонятно. ну есть же стандартный механизм в репликации в DB2, он работает примерно так 1 изменения пишутся в transaction log 2 программа capture читает transaction log и пишит изменения в так называемые CD-таблицы 3 программа apply читает CD-таблицы и применяет изменения где-нибудь на другой базе потом CD-таблицы чистятся. ничто же не мешает брать изменения прямо из CD-таблиц, а потом самому их чистить. вот если в СD-таблицах что-то есть, значит это и нужно применять на Microsoft SQL Server Спасибо за разъяснения, уже понятнее. Но не вполне. :) Уточните, это справедливо для какой платформы? (ОС). К тому же, Вы, вероятно, имеете в виду так или иначе механизм репликации, не так ли? Боюсь, что у нас он не настроен. И не будет настроен в обозримом будущем. Позволяет ли отслеживать такой механизм добавление и, самое главное, удаление, а не только изменение существующих записей в таблице-источнике? справедливо для любой платформы. сам делал для windows z/OS и аэски. ну да там задействован механизм репликации. но раз он не настроен то увы.... и конечно он позволяет отслеживать добавление и самое главное удаление... и изменение тоже и даже первичного ключа... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 17:26 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Ghola[quot Mark Barinstein]Увы-увы... Нельзя. На DB2 я могу только читать. Ни создавать триггеры ни процедуры ни функции. Ни переменные. К тому же триггеры понизят производительность БД при изменениях в таблице-источнике, а это крайне неприветствуется. Хотя замедление должно быть несущественно...Понизят что? Производительность??? В вашем тяжёлом случае, особенно с большой таблицей, нельзя говорить ни о какой производительности. Использование триггеров здесь будет самым производительным решением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2008, 17:52 |
|
||
|
Агрегатная хэш-функция средствами стандартного SQL. Есть ли варианты, лучшие, чем SUM?
|
|||
|---|---|---|---|
|
#18+
Mark Barinstein, Большое спасибо за Ваш совет! :) А экспрессия ни к чему. Впрочем, как я уже говорил, триггеры имеют для меня в данном контексте чисто академическое значение. Возвращаясь к теме топика При использовании в качестве агрегатного хэша функции SUM, в MS SQL 2000 возможно переполнение, которое приведёт к ошибке и, как следствие, - к невозможности синхронизации. Опытным путём удалось выяснить, что в MS SQL 2000 функция SUM от целочисленного аргумента возвращает результат типа NUMERIC(38,0). (челое число с 38-ю значащими цифрами, максимальная константа 10^38 - 1) Переполнение результата SUM в MS SQL наступает, если результат функции SUM превышает 10^39 - 1, см: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. В общем, описанный мной в первом постинге способ решения задачи далеко не идеален, однако в конкретной ситуации, похоже, будет для меня единственно возможным. Судя по характеру данных, до переполнения мне очень далеко. Однако предполагавшееся после синхронизации контрольное суммирование по всей таблице я, пожалуй, заменю просто на подсчёт полей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2008, 15:19 |
|
||
|
|

start [/forum/topic.php?fid=43&msg=35716851&tid=1603512]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
26ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 323ms |

| 0 / 0 |
