检查String是否以具有最佳性能的列值开始

时间:2016-04-13 09:08:34

标签: sql-server

我目前在我的数据库中有这个表(myTable):

user             start
----------------------------
Adam             12345
Alex             123
Benny            2345

在我的程序中,我接受来自用户的字符串,例如:12345678

我的目标是选择用myTable.Start

开始用户输入的行
-- For example, it would be great to have something like:

select * from myTable where "12345678".startsWith(start)

-- and returns me Adam, 12345 & Alex, 123

截至目前,我正在使用

select user, start
from myTable where charindex(start, "12345678") = 1 
order by start desc

做了这项工作,但是在绝对糟糕的表现中,myTable行数大约接近一百万,我不确定索引开始是否有帮助,因为我没有在这种情况下进行直接比较。

有谁知道更好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:0)

试试这个,

select user, start
from myTable 
where '12345678' like start+'%'
order by start desc

还要为列start添加索引。

答案 1 :(得分:-1)

您应该使用模式匹配运算符LIKE运算符并为列添加索引,例如:

select user, start
from myTable where start LIKE "12345678%"
order by start desc

如果索引性能不如以前那么糟糕 - 服务器必须检查所有行的匹配。

使用索引,操作变为范围搜索:其中start大于或等于12345678但小于下一个更高字符串的行(12345679)。范围搜索可以使用索引并仅加载处理匹配的行

修改

糟糕,错过了查询尝试相反的操作 - 找到可以充当字符串前缀的行。这不能用索引加速,因为它等同于

"someconstantvalue" LIKE start +'%'

这个在匹配之前为每一行生成一个新值,所以不能使用任何索引