Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Сравнить две одинаковые таблицы наилучшим образом / 12 сообщений из 12, страница 1 из 1
23.04.2014, 13:52
    #38623014
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
Вопрос следующий. Мне для сравнительного тестирования (срез из таблицы до и после) необходимо сравнивать результаты одной и тойже таблицы по полям (по сути сравнение двух одинаковых таблиц). Хотелось бы иметь более менее универсальное решение
Скажем есть у меня журнал проводок и для меня две записи совпадают если совпадают счета, аналитика и сумма + совпадает количество записей до и после в сравниваемом диапазоне, остальные поля при этом не важны.
Думал про варианты
1) Сравнивать соединением непродуктивно поскольку легко можно превысить количество полей в соединении
2) Создать составной ключ (все в одну строку) можно но учитывая размер ссылок, можно легко превысить 900 байт на размер полей в индексе
3) Остается вычисление хэшфункций . Как понимаю в MSSQL есть CheckSum\HashBytes ей можно воспользоваться
Вопрос какие еще есть варианты? Может какие нибудь особые виды индексов. Из СУБД мне доступны MSSQL и Oracle.
...
Рейтинг: 0 / 0
23.04.2014, 14:39
    #38623104
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
selis761) Сравнивать соединением непродуктивно поскольку легко можно превысить
количество полей в соединении
У условий соединения нет ограничения на количество полей. Так что FULL JOIN в руки и будет
тебе счастье.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.04.2014, 14:40
    #38623108
movingshadow
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
selis763) Остается вычисление хэшфункций . Как понимаю в MSSQL есть CheckSum\HashBytes ей можно воспользоваться
При сравнении всех записей между собой только лишь по значению хэша возможны коллизии. Вероятность совпадения хэша зависит от того сколько у вас записей и от длинны хэша.

32-битный CHECKSUM сразу можете вычеркивать. CHECKSUM (Transact-SQL) :авторHowever, there is a small chance that the checksum will not change. For this reason, we do not recommend using CHECKSUM to detect whether values have changed , unless your application can tolerate occasionally missing a change. Consider using HashBytes instead. У HASHBYTES с алгоритмом SHA вероятность коллизий очень низкая, но это 20Кб плюс вычисление потребует время. MD5 можно рассматривать только, если у вас совсем мало данных.
...
Рейтинг: 0 / 0
23.04.2014, 15:38
    #38623256
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
Dimitry SibiryakovУ условий соединения нет ограничения на количество полей. Так что FULL JOIN в руки и будет
тебе счастье.

А подводные камни возникнут? просто я всегда думал что для соединения нужен комбинированный индекс по полям соединения
напр у меня 9 полей для соединения, для этого мне нужно построить индекс содержащий эти 9 полей. Если я построю отдельные индексы на каждое поле как понимаю оптимизатор не сможет их применять. Но тогда получается что я всеравно ограничен длиной суммы полей в комбинированном индексе. Ессно соединение без индекса не рассматривается .
...
Рейтинг: 0 / 0
23.04.2014, 15:53
    #38623288
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
selis76Ессно соединение без индекса не рассматривается .
Запрещено религией или ты никогда не слышал о HASH/MERGE JOIN?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.04.2014, 18:14
    #38623563
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
Как я помню из анализа планов запроса (по Oracle, меньше по MSSQL)
Hash join делался когда есть составной индекс по полям учавствующим в условиях join
Loop join когда индекса нет либо он не по всем полям
а так чтобы Hash join \Merge join делался без индекса не припоминаю, возможно таблицы были большие.
У меня на практике так было - если индекса нет оптимизатор уходит в Loop join большим временем. Если что статистику собирал, но как говорится на "всякий случай" , в основно ориентировался на явное присутствие индекса по соединяемым полям.
В моей задачи таблица немаленькая поэтому без индексов с ней работать религия не позволяет
...
Рейтинг: 0 / 0
23.04.2014, 18:31
    #38623583
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
selis76Hash join делался когда есть составной индекс по полям учавствующим в
условиях join
Loop join когда индекса нет либо он не по всем полям
Вообще-то всё с точностью до наоборот. В какое место hash join-у совать индекс-то?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.04.2014, 18:55
    #38623610
selis76
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
В общем нужно мне курить тему глубже http://blogs.msdn.com/b/craigfr/archive/2006/08/03/merge-join.aspx
но сформулирую более ясно мысль, если нет индекса какой бы метод оптимизатор не выбрал (loop, megre, hash) он будет делать table scan , если есть то index seek
но при этом получается не обязательно наличие составного индекса, достаточно индексов по отдельным полям
...
Рейтинг: 0 / 0
23.04.2014, 19:05
    #38623620
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
selis76если нет индекса какой бы метод оптимизатор не выбрал (loop, megre, hash) он
будет делать table scan , если есть то index seek
И поскольку для сравнения необходимо пройти абсолютно все записи, он потеряет на этом в
скорости.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.04.2014, 19:13
    #38623631
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
Dimitry Sibiryakovselis76если нет индекса какой бы метод оптимизатор не выбрал (loop, megre, hash) он
будет делать table scan , если есть то index seek
И поскольку для сравнения необходимо пройти абсолютно все записи, он потеряет на этом в
скорости.

Зачем проходить для сравнения все записи?
Но в скорости он таки да, в большинстве случаев потеряет :) Не из-за того что "нужно проходить все записи", а потому что надо делать RID LOOKUP-ы для сравнения полей, не входящих в индекс.
...
Рейтинг: 0 / 0
24.04.2014, 13:55
    #38624571
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
Кот МатроскинDimitry Sibiryakovпропущено...

И поскольку для сравнения необходимо пройти абсолютно все записи, он потеряет на этом в
скорости.

Зачем проходить для сравнения все записи?
Но в скорости он таки да, в большинстве случаев потеряет :) Не из-за того что "нужно проходить все записи", а потому что надо делать RID LOOKUP-ы для сравнения полей, не входящих в индекс.
а сколько?? половину сравнить и хватит?
...
Рейтинг: 0 / 0
24.04.2014, 14:35
    #38624659
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить две одинаковые таблицы наилучшим образом
Ivan Durak,

Хватит тех, которые попадут в range соответствущего индекса.
Если мы ищем записи по условию A = 1 and B = 2 and С in (3, 4) и у нас есть индекс по A - вполне достаточно отобрать для дальнейших сравнений по диапазону индекса записи с A = 1, остальные просматривать не надо ;)
Другой вопрос (как я написал выше), что это может не оказаться оптимальной стратегией - но правильный результат будет достигнут.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Сравнить две одинаковые таблицы наилучшим образом / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]