У нас есть SQL, который выполняет функцию CAST (для FLOAT) в ColumnA. SQL имеет фильтр, который в конце концов косвенно отфильтрует те строки, которые имеют нечисловые значения в ColumnA. Однако из-за того, что, по моему мнению, происходит из-за запуска частей SQL в paralell, я считаю, что CAST даже применяется к отфильтрованным строкам, и это приводит к сбою SQL при «невозможности приведения значения как float ...» "
Я знаю, что если я запускаю один процесс, добавив подсказку запроса
OPTION (MAXDOP 1)
что SQL работает так, как ожидалось. Я подозреваю, что при запуске в 1 proc принудительно будет применен фильтр, чтобы отсеять строку с нечисловыми значениями в columnA так, чтобы CASTING его значений был успешным. Я также обнаружил, что с помощью подсказки запроса
OPTION (FORCE ORDER)
устраняет проблему, я предполагаю, потому что это также гарантирует, что фильтр будет применен первым, и я получаю намного лучшую производительность запросов, чем тот, который работает на одном цилиндре.
Я склоняюсь к решению проблемы, используя второй вариант. Если у меня возникнут какие-либо неправильные представления о том, что здесь происходит, или если кто-то захочет изложить мое общее понимание или дать рекомендацию, я был бы признателен.
Я работаю на
Microsoft SQL Server 2008 R2 (окончательная первоначальная версия) - 10.50.1720.0 (X64) 12 июня 2010 г.
01:34:59 Copyright (c) Microsoft Corporation Enterprise Edition
(64-разрядная версия) в Windows NT 5.2 (сборка 3790: пакет обновления 2)
Запоздалая мысль:
Кажется, было бы неплохо, если бы T-SQL имел следующие функции, чтобы проверить, можно ли преобразовать строку в конкретный тип данных.
IsFloat
IsNumeric
IsInteger
и т.д.
Меня действительно раздражает, сколько столбцов всех видов данных, которые я нахожу в нашей базе данных, которые определены как varchar (255). Я думаю, что решение "не делать этого!"