ORACLE SQL以结束为时间

问题描述 投票:1回答:2

我们有表格,我们在用户登录应用程序时记录详细信息。我们使用下面的查询来获取工作正常的细节

select username 
from table  
where username like 'abc%' 
order by timestamp desc

我们得到结果

abcxyz

但是当我们将%放在字符串的开头时,它需要花费太多时间并且不会给出任何结果。

select username 
from table  
where username like '%xyz' 
order by timestamp desc

要么

select username 
from table  
where username like '%cx%' 
order by timestamp desc

用户名列是索引PFB详细信息。 column_position:1 column_length:512 CHAR_length:512 Descend:ACS

有人可以解释这种行为,我怎样才能得到第二次/第三次查询的结果?

sql oracle where sql-like
2个回答
4
投票

如果username专栏有一个索引,你的观察将是完全可以预期的。如果它确实有索引,那么在搜索匹配的用户记录时,以下查询可以利用该索引:

select username from table where username like 'abc%' order by timestamp desc

username上的索引对上面的LIKE表达式有帮助的原因是在用户名上从左到右构建了B树。

另一方面,username上的索引对以下查询没有帮助:

select username from table where username like '%xyz' order by timestamp desc

在这种情况下,B树无法帮助我们找到以xyz结尾的用户名。情况就是这样,因为这样的匹配记录可以出现在树中的任何地方。相反,可能需要进行全表扫描。

有关详细信息,您可以尝试在两个查询上运行说明。


0
投票

第一个示例获取以“abc”开头的所有用户名,其余的可以是任何内容。

第二个选择以ANYTHING开头的所有用户名,因此它必须执行全表扫描(USERNAME列上是否有索引)。为什么它不返回任何东西?好吧,你有数据,我们没有。根据您所写的内容,没有用户名以小写xyz结尾。

第三个SELECT也是如此。

如果经常执行此类查询,请考虑使用Oracle Text。

© www.soinside.com 2019 - 2024. All rights reserved.