Спасибо, интересно. Немного про цифры. Подправьте слайды. Если в Shard 1 хранится диапазон [0, 50], то Shard 2 должен начинаться, очевидно, с 51, а не с 50.
Заканчивается текущий проект, готовлюсь к новым собеседованиям, и вернулся к этой статье. Очень информативная и полезная статья. Огромное спасибо автору. И актуальной эта статья будет всегда.
Поэтому есть небольшая коррекция по секции «ISNULL и COALESCE».
В статье:
Функция ISNULL преобразует к наименьшему типу из двух операндов. COALESCE преобразует к наибольшему типу.
Немного не так. Из документации: ISNULL — Replaces NULL with the specified replacement value. И чуть дальше: Returns the same type as check_expression. Check_expression в нашем случае было CHAR(1), а replacement_value ’NULL’ - четыре символа. Вот и получим в ответе первый символ из replacement_value. Хотя, как на меня, могли бы и синтаксическую ошибку здесь высветить.
По COALESCE ситуация другая. Здесь никаких преобразований или замен нет, просто выдать первое не NULL значение из приведенного списка. Evaluates the arguments in order and returns the current value of the first expression that initially doesn’t evaluate to NULL. В списке допускаются типы данных, которые могут быть неявно преобразованы друг в друга (implicit conversion), хотя в документации об этом явно не указано. Есть только что вернет тип данных с наивысшим приоритетом: Returns the data type of expression with the highest data type precedence. Так что со списком из разных типов данных и результатом COALESCE нужно быть аккуратным.
Надеюсь, моё дополнение будет полезно.
Ответ: вероятность 50%, поскольку или четное количество, или нечетное (про четный 0 здесь было). Других вариантов нет. О чем спор? Непонимаю :) Смотрите на проблему шире, ну или ширшее :)
— Миколо, ты после секса душ принимаешь?
— Да, а шо?
— Тебе уже пора заняться сексом.
Присмотрелся, таки да. Снимаю предложение :)