SUBSTRING vs LEFT в SQL SERVER

Я разместил вопрос здесь, но никто не ответил, поэтому я попытался сосредоточиться на том, что делает мой запрос медленным, и на мой вопрос встал вопрос. Какой из них быстрее и эффективнее? LEFT или SUBSTRING?

Ответ 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