以 结尾的 ORACLE SQL 需要时间

roh*_*k89 2 sql oracle where sql-like

我们有表格,每当用户登录应用程序时,我们都会在其中记录详细信息。我们使用以下查询来获取工作正常的详细信息

select username 
from table  
where username like 'abc%' 
order by timestamp desc
Run Code Online (Sandbox Code Playgroud)

我们得到结果

abcxyz
Run Code Online (Sandbox Code Playgroud)

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

select username 
from table  
where username like '%xyz' 
order by timestamp desc
Run Code Online (Sandbox Code Playgroud)

或者

select username 
from table  
where username like '%cx%' 
order by timestamp desc
Run Code Online (Sandbox Code Playgroud)

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

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

Tim*_*sen 5

如果username列上有索引,您的观察将完全符合预期。如果它确实有索引,那么以下查询可以在搜索匹配的用户记录时利用该索引:

select username from table where username like 'abc%' order by timestamp desc
Run Code Online (Sandbox Code Playgroud)

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

在另一方面,在索引username不会对下面的查询有所帮助:

select username from table where username like '%xyz' order by timestamp desc
Run Code Online (Sandbox Code Playgroud)

在这种情况下,B树不能帮助我们找到用户名结束xyz。之所以如此,是因为此类匹配记录可能出现在树中的任何位置。相反,可能需要进行全表扫描。

有关更多信息,您可以尝试对两个查询运行解释。

  • @rohitrk89我不是Oracle专家,我不知道它是否有反向索引的概念。您可以做的一件事是将字符串反向存储在单独的列中并为其建立索引。这会占用一些空间,但是您可以在反转的字符串上使用“LIKE 'xyz%'”。 (2认同)