Ответ 1
+1 для интересного вопроса. Ваша оценка того, что SQL Server может существенно изменить каждый оператор с помощью оптимизации, вероятно, точна; так же, как и ваша оценка, что в таком большом наборе SQL Server может кэшировать один запрос лучше другого.
На ум приходят еще две вещи, которые могут быть (смутно) релевантными:
-
Потребление памяти; Мне было бы любопытно, если комбинация LEFT/RIGHT потребляет немного больше памяти. Теоретически возвращаемое значение первой функции должно быть сохранено так, чтобы оно могло быть передано во вторую функцию, хотя один и тот же регистр мог использоваться снова и снова.
-
Проверка границ. Varchar - это в основном указатель на начало char [] с двумя дополнительными байтами для указания длины. Это предполагает, что при доступе к значению индексом необходимо выполнить некоторую проверку границ, посмотрев на значение, содержащееся в этих двух байтах, чтобы убедиться, что оно не находится за пределами допустимого диапазона.
SQL Server также очень прощает, делая запросы за пределами строки с символами и varchars. Следующий код будет работать без ошибок.
DECLARE @Test varchar(50);
SET @Test = 'Hello World';
SELECT substring(@Test, 2, 4);
SELECT substring(@Test, 2000, 5000);
Так будет:
SELECT right(left(@test, 500), 400);
Я предполагаю, что объяснение для ответа на ваш вопрос лежит в чем-то связанном; к сожалению, я не знаю знаю ответ на ваш вопрос.
Мне было бы любопытно, если бы вы получили те же результаты производительности, что и более длинная строка, или char по сравнению с varchar. Эти тесты могут дать больше информации о внутренних компонентах SQL Server.