Я разместил вопрос здесь, но никто не ответил, поэтому я попытался сосредоточиться на том, что делает мой запрос медленным, и на мой вопрос встал вопрос. Какой из них быстрее и эффективнее? LEFT или SUBSTRING?
SUBSTRING vs LEFT в SQL SERVER
Ответ 1
SQL Server - это база данных. Вы не задаете вопросов о том, какая функция обработки строк "быстрее". Вы задаете вопросы, которые могут использовать индекс? и "у меня есть необходимый индекс?". Все о доступе к данным, поскольку диски - это sloooooow, а не о смещении регистров процессора.
Итак, , который может использовать индекс? (какой из них sargable?). Теоретически LEFT
может использовать индекс, но на практике он обычно этого не делает. SUBSTRING
не может. Вместо SUBSTRING
используйте Полный текст.
Создайте свою модель данных, чтобы воспользоваться преимуществами выражений sargable, соответственно указав. Это все, что есть, нет волшебной пули. Избегайте сканирования.
Ответ 2
Между left
и substring
нет разницы, потому что left
переведен в substring
в плане выполнения.
Например:
select substring(col, 1, 2),
left(col, 3)
from YourTable
будет выглядеть так в плане выполнения
<DefinedValue>
<ColumnReference Column="Expr1004" />
<ScalarOperator ScalarString="substring([col],(1),(2))">
<Intrinsic FunctionName="substring">
<ScalarOperator>
<Identifier>
<ColumnReference Column="col" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(1)" />
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(2)" />
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</DefinedValue>
<DefinedValue>
<ColumnReference Column="Expr1005" />
<ScalarOperator ScalarString="substring([col],(1),(3))">
<Intrinsic FunctionName="substring">
<ScalarOperator>
<Identifier>
<ColumnReference Column="col" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(1)" />
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(3)" />
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</DefinedValue>
Ответ 3
Это хорошая статья, которая сравнивает производительность между SUBSTRING, LIKE, CHARINDEX, и LEFT/RIGHT, если кто-то заинтересован.
Согласно результатам, для неиндексированных столбцов LEFT/RIGHT последовательно быстрее, чем SUBSTRING.
Ответ 4
Когда вы используете функции предикатов, ваш движок будет вынужден использовать операцию сканирования над операцией Seek. Теоретически Левый выглядит благосклонно к использованию индекса. Но ваш двигатель все еще не знает выход функции Left(), пока он не будет выполнен. То же самое и для Substring().
Если вы действительно хотите настроить свою эффективность запроса, вы можете заменить выражение Left() выражением LIKE. Убедитесь, что символ подстановки% в конце. Это выражение будет использовать Index Seek (если у вас есть соответствующий индекс в столбце).
Пример
Влево (MyColumn, 2) = 'AB' → MyColumn LIKE 'AB%'
Фактически, оператор LIKE (с символом подстановки% в конце), в конечном счете, преобразуется в логические предикаты поиска с помощью движка. Таким образом, вышеупомянутое выражение LIKE будет переписано движком, как показано ниже,
MyColumn LIKE 'AB%' → MyColumn >= 'AB' и MyColumn < 'AC'
Для Substring() у вас нет лучшей замены, и вам нужно подумать о других альтернативах, таких как Full Text.
Ответ 5
Таблица, подобная этой
Id_num Fname Minit Lname ids
1 Karin F Josephs 3
2 Pirkko O Koskitalo 56
3 Karin F Josephs 16
4 Pirkko O Koskitalo 96
1 Karin F Josephs 3
2 Pirkko O Koskitalo 56
подстроки:
Using Substring give the initial position values and End position values.
Например:
select SUBSTRING(Fname,2,5) from new_employees
(No column name)
arin
irkko
arin
irkko
arin
irkko
Слева:
using Substring give only how many char you want from LEFT Side.
Например:
select left(Fname,2) from new_employees
(No column name)
Ka
Pi
Ka
Pi
Ka
Pi