Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL SERVER中的子字符串vs LEFT_Sql_Sql Server_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

SQL SERVER中的子字符串vs LEFT

SQL SERVER中的子字符串vs LEFT,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,我发了一个问题,但没有人回答,所以我试着集中精力,是什么让我的提问变慢了,一个问题出现在我的脑海里哪一个更快更高效?左边还是子字符串?SQL Server是一个数据库。您不会问哪个字符串处理函数“更快”的问题。你会问“哪一个可以使用索引?”和“我有所需的索引吗?”。都是关于数据访问的,因为磁盘是慢的,而不是关于CPU寄存器的移位 那么,哪个可以使用索引?(哪个是?)。理论上,LEFT可以使用索引,但实际上通常不会子字符串不能。不要使用子字符串 设计数据模型以利用可搜索表达式,并相应地编制索引。这

我发了一个问题,但没有人回答,所以我试着集中精力,是什么让我的提问变慢了,一个问题出现在我的脑海里哪一个更快更高效?左边还是子字符串?

SQL Server是一个数据库。您不会问哪个字符串处理函数“更快”的问题。你会问“哪一个可以使用索引?”和“我有所需的索引吗?”。都是关于数据访问的,因为磁盘是慢的,而不是关于CPU寄存器的移位

那么,哪个可以使用索引?(哪个是?)。理论上,
LEFT
可以使用索引,但实际上通常不会<代码>子字符串不能。不要使用
子字符串


设计数据模型以利用可搜索表达式,并相应地编制索引。这就是全部,没有神奇的子弹。避免扫描

当您在谓词上使用函数时,您的引擎将被迫在搜索操作上使用扫描操作。从理论上讲,左派倾向于巧妙地使用索引。但是,在执行Left()函数之前,引擎仍然不知道它的输出。因此,Substring()也是如此

如果确实想优化查询的性能,可以将Left()表达式替换为LIKE表达式。请确保结尾处有%通配符。此表达式将使用索引查找(如果列上有适当的索引)

例如

左(MyColumn,2)='AB'>MyColumn-LIKE'AB%'

实际上,LIKE运算符(末尾带有%通配符)最终由引擎转换为逻辑查找谓词。因此,引擎将重写上述类似表达式,如下所示:

类似于“AB%”的菌柱>菌柱>='AB'和菌柱<'AC'


对于Substring(),您没有更好的替代方法,您必须考虑其他替代方法,如全文。

子字符串之间没有任何区别,因为
在执行计划中被转换为
子字符串

例如:

选择子字符串(列,1,2),
左(第3列)
从你的桌子上
在执行计划中会像这样


像这样的表格

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.
例如:

左:

例如:

如果有人感兴趣,它会在子字符串(比如CHARINDEX)和左/右之间测试性能


根据结果,在非索引列上,左/右始终比子字符串快。

我真的不认为会有任何性能差异。@Remus的答案表明,两者之间的差异可以忽略不计。如前所述,避免使用任何一个。左字符串和子字符串(从1到n)都应该能够使用类似于“xxxx%”的索引访问。当然,只有当它是一种按排序顺序携带实际数据的索引时。优化器必须足够聪明才能使用它:-)@dnoeth:我同意,如果您想搜索全文或未定义的部分,请使用全文搜索。如果您总是希望搜索第一个n(其中n是已知且恒定的),请创建一个单独的列,可能是计算列。为单独的列编制索引,不要使用FTS、LEFT或SUBSTRING。谢谢。通过研究我庞大的数据库,我发现两者几乎相同。你说得很对。
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