Каковы различия между CHECKSUM () и BINARY_CHECKSUM () и когда / каковы соответствующие сценарии использования? - PullRequest
17 голосов
/ 06 августа 2009

Опять же, MSDN в действительности не объясняет простым языком точную разницу или информацию о том, когда выбирать одно из другого.

СУММА

Возвращает значение контрольной суммы, вычисленное по строке таблицы или по списку выражений. CHECKSUM предназначен для использования в построении хеш-индексов.

BINARY_CHECKSUM

Возвращает двоичное значение контрольной суммы, рассчитанное по строке таблицы или по списку выражений. BINARY_CHECKSUM может использоваться для обнаружения изменений в строке таблицы.

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

Ответы [ 5 ]

17 голосов
/ 06 августа 2009

Ознакомьтесь со следующим сообщением в блоге, в котором освещаются различия.

http://decipherinfosys.wordpress.com/2007/05/18/checksum-functions-in-sql-server-2005/

Добавление информации по этой ссылке:

Ключевым назначением функций CHECKSUM является создание хеш-индекса на основе выражения или списка столбцов. Если, скажем, вы используете его для вычисления и сохранения столбца на уровне таблицы для обозначения контрольной суммы по столбцам, которые делают запись уникальной в таблице, то это может быть полезно при определении, изменилась ли строка или нет. Этот механизм затем можно использовать вместо объединения со всеми столбцами, которые делают запись уникальной, чтобы увидеть, была ли запись обновлена ​​или нет. Электронная документация по SQL Server содержит множество примеров этой функциональности.

Несколько вещей, на которые следует обращать внимание при использовании этих функций:

Необходимо убедиться, что столбцы или порядок выражений одинаковы между двумя сравниваемыми контрольными суммами, иначе значение будет другим и приведет к проблемам.

Мы не рекомендуем использовать контрольную сумму (*), поскольку значение, которое будет сгенерировано таким образом, будет основано на порядке столбцов определения таблицы во время выполнения, который может легко измениться в течение определенного периода времени. Итак, явно определите список столбцов.

Будьте внимательны при включении столбцов типа данных datetime, поскольку гранулярность составляет 1/300 секунды, и даже небольшое изменение приведет к другому значению контрольной суммы. Поэтому, если вам нужно использовать столбец типа данных datetime, убедитесь, что вы получите точную дату + час / мин. то есть уровень детализации, который вы хотите.

Вам доступны три функции контрольной суммы:

CHECKSUM: это было описано выше.

CHECKSUM_AGG: возвращает контрольную сумму значений в группе, и значения Null в этом случае игнорируются. Это также работает с предложением OVER новой аналитической функции в SQL Server 2005.

BINARY_CHECKSUM: как следует из названия, возвращается двоичное значение контрольной суммы, вычисленное по строке или списку выражений. Разница между CHECKSUM и BINARY_CHECKSUM заключается в значении, сгенерированном для строковых типов данных. Примером такой разницы являются значения, сгенерированные для «DECIPHER» и «decipher», которые будут разными в случае BINARY_CHECKSUM, но будут одинаковыми для функции CHECKSUM (при условии, что у нас установлена ​​инстанция без учета регистра). Другое отличие заключается в сравнении выражений. BINARY_CHECKSUM () возвращает одно и то же значение, если элементы двух выражений имеют одинаковый тип и байтовое представление. Таким образом, «2Volvo Director 20» и «3Volvo Director 30» приведут к одному и тому же значению, однако функция CHECKSUM () оценивает тип, а также сравнивает две строки и, если они равны, возвращается только одно и то же значение.

Example:
STRING              BINARY_CHECKSUM_USAGE    CHECKSUM_USAGE
------------------- ----------------------    -----------
2Volvo Director 20  -1356512636                -341465450
3Volvo Director 30  -1356512636                -341453853
4Volvo Director 40  -1356512636                -341455363
8 голосов
/ 14 января 2011

HASHBYTES с MD5 в 5 раз медленнее, чем CHECKSUM, я проверил это на таблице с более чем 1 миллионом строк и провел каждый тест 5 раз, чтобы получить среднее значение.

Интересно, что CHECKSUM занимает ровно столько же времени, сколько BINARY_CHECKSUM.

Вот мой пост с полными опубликованными результатами: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/

4 голосов
/ 09 ноября 2009

Я обнаружил, что коллизии контрольной суммы (то есть два разных значения, возвращающие одну и ту же контрольную сумму) встречаются чаще, чем кажется большинству людей. У нас есть таблица валют, использующая код валюты ISO в качестве PK. И в таблице, содержащей менее 200 строк, есть три пары кодов валют, которые возвращают один и тот же Binary_Checksum ():

  • "ETB" и "EUR" (эфиопские быры и евро) возвращают 16386.
  • «LTL» и «MDL» (литовский лит и молдавский лей) возвращают 18700.
  • "TJS" и "UZS" (сомони и узбекский сом) оба возвращают 20723.

То же самое происходит с кодами культуры ISO: "de" и "eu" (немецкий и баскский) возвращают 1573.

Изменение Binary_Checksum () на Checksum () решает проблему в этих случаях ... но в других случаях это может не помочь. Поэтому я советую тщательно протестировать, прежде чем слишком сильно полагаться на уникальность этих функций.

3 голосов
/ 09 января 2014

Будьте осторожны при использовании CHECSUM, вы можете получить неожиданный результат. следующие операторы производят одно и то же значение контрольной суммы;

SELECT CHECKSUM (N'这么便宜怎么办?廉价iPhone售价再曝光', 5, 4102)
SELECT CHECKSUM (N'PlayStation Now – Sony startet Spiele-Streaming im Sommer 2014', 238, 13096)
2 голосов
/ 07 августа 2009

Его легко получить из CHECKSUM (). HASHBYTES () был добавлен в SQL 2005 для улучшения функциональности хэширования системы SQL Server, поэтому я предлагаю вам также рассмотреть эту альтернативу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...