Sql 如何通过选择表中最长的前缀来提高性能

Sql 如何通过选择表中最长的前缀来提高性能,sql,sybase,Sql,Sybase,有一个表包含一些值,如: id | prefix | name ----+----------------+-------------------------- 1 | record1 | name for record 1 2 | record2 | name for record 2 3 | record | name for record 3 4 | another rec | name for reco

有一个表包含一些值,如:

id  | prefix         | name 
----+----------------+--------------------------
1   | record1        | name for record 1
2   | record2        | name for record 2
3   | record         | name for record 3
4   | another rec    | name for record 4
为了选择给定文本的最长前缀并返回名称,我使用以下SQL:

select top 1 name from prefixes where :text like prefix + '%' order by prefix desc
这正是我所需要的,当我给文本
record1
时,它返回我
记录2的名称
record1
它返回我
记录1的名称
,如果我给
a
它返回我
记录4的名称


但是问题是,这执行了几次,并且表被更新了很多,所以在我的例子中(只有210000行的表)的性能大约是300ms,我想减少这个,查询甚至数据库是否有改进的地方?

我对Sybase的内部结构不太了解。但是,请查看计划,看看它是否正在使用索引。如果是这样的话,它是在对索引进行全面扫描,还是引擎足够聪明,能够理解“like”

我猜引擎正在进行全面扫描。您可以通过更改查询来欺骗它,使其寻找正确的起始位置:

where prefix >= :text and :text like prefix + '%'
但是,它可能会从该点开始进行完整扫描。您可以通过设置最大搜索位置来解决此问题:

where prefix >= :text and prefix <= :text + 'zzz'

where prefix>=:文本和前缀在
prefix
列上定义了索引吗?是的,已经定义了。。。但真正奇怪的是,当在前缀上创建索引时,查询似乎更慢。。。我不确定这是否与查询中的类似内容相关,因为
%
前缀部分之后,而不是在开头。虽然您可能希望在
前缀
名称
上都有一个覆盖索引。我不明白,为什么我要为名称添加一个索引。这种事情让我感到非常惊讶。。。这样一个简单的方法来解决问题,在我的例子中,查询从500毫秒下降到70毫秒!谢谢