В настоящее время мы работаем с SQL Server 2016, и мы заметили кое-что, что заставило нас задуматься.
Мы выполняли запрос к таблице, которая иногда вызывала деление на ноль.
Настройка выглядит примерно так
SELECT
PT.ID, SUM(FT.Value1 / FT.Value2)
FROM
PrimaryTable PT
JOIN
ForeignTable FT ON PT.ID = FT.ForeignID
WHERE
PT.Date >= @DateStart
AND PT.Date < @DateEnd
Теперь исправление довольно очевидно, если использовать NULLIF
на FT.Value2, чтобы избежать деления на ноль.
Однако мы не смогли найти ни одной строки, которая фактически заставила бы сервер столкнуться с этой проблемой вообще, если бы она была ограничена отфильтрованными датами.Любопытно, что это также не произошло надежно.Мы могли бы отследить, что это зависит от того, сколько строк действительно существует в обеих таблицах.Если это произошло - это было воспроизводимо.Однако, если другие операции добавляются, удаляются или изменяются строки, это может быть причиной того, что деление на ноль не происходит.
Сервер работает как машина Hyper-V с 8 виртуальными ядрами и достаточным объемом ОЗУ для установкиобе таблицы более чем в 10 раз.Поэтому я подумал, что причиной проблемы могут быть параллельные вычисления.
Действительно ли SQL Server вычисляет результаты столбцов перед фильтрацией по оператору where?Или почему это может привести к делению на ноль, если ни одна из затронутых строк на самом деле не вызовет такое деление.