|
|
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
Вопрос следующий. Мне для сравнительного тестирования (срез из таблицы до и после) необходимо сравнивать результаты одной и тойже таблицы по полям (по сути сравнение двух одинаковых таблиц). Хотелось бы иметь более менее универсальное решение Скажем есть у меня журнал проводок и для меня две записи совпадают если совпадают счета, аналитика и сумма + совпадает количество записей до и после в сравниваемом диапазоне, остальные поля при этом не важны. Думал про варианты 1) Сравнивать соединением непродуктивно поскольку легко можно превысить количество полей в соединении 2) Создать составной ключ (все в одну строку) можно но учитывая размер ссылок, можно легко превысить 900 байт на размер полей в индексе 3) Остается вычисление хэшфункций . Как понимаю в MSSQL есть CheckSum\HashBytes ей можно воспользоваться Вопрос какие еще есть варианты? Может какие нибудь особые виды индексов. Из СУБД мне доступны MSSQL и Oracle. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 13:52 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
selis761) Сравнивать соединением непродуктивно поскольку легко можно превысить количество полей в соединении У условий соединения нет ограничения на количество полей. Так что FULL JOIN в руки и будет тебе счастье. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 14:39 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
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 можно рассматривать только, если у вас совсем мало данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 14:40 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovУ условий соединения нет ограничения на количество полей. Так что FULL JOIN в руки и будет тебе счастье. А подводные камни возникнут? просто я всегда думал что для соединения нужен комбинированный индекс по полям соединения напр у меня 9 полей для соединения, для этого мне нужно построить индекс содержащий эти 9 полей. Если я построю отдельные индексы на каждое поле как понимаю оптимизатор не сможет их применять. Но тогда получается что я всеравно ограничен длиной суммы полей в комбинированном индексе. Ессно соединение без индекса не рассматривается . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 15:38 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
selis76Ессно соединение без индекса не рассматривается . Запрещено религией или ты никогда не слышал о HASH/MERGE JOIN?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 15:53 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
Как я помню из анализа планов запроса (по Oracle, меньше по MSSQL) Hash join делался когда есть составной индекс по полям учавствующим в условиях join Loop join когда индекса нет либо он не по всем полям а так чтобы Hash join \Merge join делался без индекса не припоминаю, возможно таблицы были большие. У меня на практике так было - если индекса нет оптимизатор уходит в Loop join большим временем. Если что статистику собирал, но как говорится на "всякий случай" , в основно ориентировался на явное присутствие индекса по соединяемым полям. В моей задачи таблица немаленькая поэтому без индексов с ней работать религия не позволяет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 18:14 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
selis76Hash join делался когда есть составной индекс по полям учавствующим в условиях join Loop join когда индекса нет либо он не по всем полям Вообще-то всё с точностью до наоборот. В какое место hash join-у совать индекс-то?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 18:31 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
В общем нужно мне курить тему глубже http://blogs.msdn.com/b/craigfr/archive/2006/08/03/merge-join.aspx но сформулирую более ясно мысль, если нет индекса какой бы метод оптимизатор не выбрал (loop, megre, hash) он будет делать table scan , если есть то index seek но при этом получается не обязательно наличие составного индекса, достаточно индексов по отдельным полям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 18:55 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
selis76если нет индекса какой бы метод оптимизатор не выбрал (loop, megre, hash) он будет делать table scan , если есть то index seek И поскольку для сравнения необходимо пройти абсолютно все записи, он потеряет на этом в скорости. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 19:05 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovselis76если нет индекса какой бы метод оптимизатор не выбрал (loop, megre, hash) он будет делать table scan , если есть то index seek И поскольку для сравнения необходимо пройти абсолютно все записи, он потеряет на этом в скорости. Зачем проходить для сравнения все записи? Но в скорости он таки да, в большинстве случаев потеряет :) Не из-за того что "нужно проходить все записи", а потому что надо делать RID LOOKUP-ы для сравнения полей, не входящих в индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.04.2014, 19:13 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
Кот МатроскинDimitry Sibiryakovпропущено... И поскольку для сравнения необходимо пройти абсолютно все записи, он потеряет на этом в скорости. Зачем проходить для сравнения все записи? Но в скорости он таки да, в большинстве случаев потеряет :) Не из-за того что "нужно проходить все записи", а потому что надо делать RID LOOKUP-ы для сравнения полей, не входящих в индекс. а сколько?? половину сравнить и хватит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2014, 13:55 |
|
||
|
Сравнить две одинаковые таблицы наилучшим образом
|
|||
|---|---|---|---|
|
#18+
Ivan Durak, Хватит тех, которые попадут в range соответствущего индекса. Если мы ищем записи по условию A = 1 and B = 2 and С in (3, 4) и у нас есть индекс по A - вполне достаточно отобрать для дальнейших сравнений по диапазону индекса записи с A = 1, остальные просматривать не надо ;) Другой вопрос (как я написал выше), что это может не оказаться оптимальной стратегией - но правильный результат будет достигнут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2014, 14:35 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38623583&tid=1540911]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
166ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 278ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...