Рассмотрим следующий запрос SQL Server 2005/2008:
Select [UID], [DESC] From SomeTable Order By [Desc];
Если поле Desc довольно длинное (Varchar (125) с множеством записей> 70 символов) и вам не нужна строгая сортировка, было бы более эффективно сделать это:
Select [UID], [DESC] From SomeTable Order By Substring([Desc], 0, 20);
Преимущество заключается в том, что все сравнения довольно короткие (не более 20 символов). Недостатком является то, что он вызывает вызов Substring. В нынешних целях предположим, что вы не хотите помещать индекс в это поле, так как это не первичный ключ, а вышеприведенное является довольно редкой операцией. Какой вариант вы бы выбрали?
Примечание 2: Я спрашиваю здесь в основном из любопытства. В моем приложении Desc является индексированным полем, и я не использую подстроку. Однако я кратко рассмотрел возможность использования Substring, и мне пришло в голову, что я действительно не знаю, какой из вышеперечисленных подходов будет более эффективным.
Наконец, бонусный вопрос: правда ли, что использование Substring в индексированном поле заставит оптимизатор пропустить индекс, а действительно замедлит процесс? Я не думаю, что оптимизатор достаточно умен, чтобы использовать индекс, если используется подстрока (даже с нулевым основанием), но я слишком занят, чтобы проверить это прямо сейчас. Однако, если вы знаете по-другому, пожалуйста, поправьте меня!
Обновление / уточнение: Вы должны предполагать, что поле Desc не проиндексировано для целей исходного вопроса. Если он проиндексирован, ответ довольно прост.