0

我将其用作子选择(在连接其他 2 个表的简单查询中),您可以想象它需要一段时间才能运行。到目前为止,持续了 6 小时以上。这是唯一的方法吗?我知道做另一个 JOIN 而不是子选择可能会有所帮助。但主要瓶颈是所有这些 OR 和子字符串。

SELECT ex_array
FROM   service_x 
WHERE  
   ( substr(ex_array,1,2) = 'FW' OR substr(ex_array,3,2) = 'FW' OR substr(ex_array,5,2) = 'FW' OR substr(ex_array,7,2) = 'FW' OR substr(ex_array,9,2) = 'FW' OR substr(ex_array,11,2) = 'FW' ) 
OR ( substr(ex_array,1,2) = 'IL' OR substr(ex_array,3,2) = 'IL' OR substr(ex_array,5,2) = 'IL' OR substr(ex_array,7,2) = 'IL' OR substr(ex_array,9,2) = 'IL' OR substr(ex_array,11,2) = 'IL' )  
OR ( substr(ex_array,1,2) = 'IN' OR substr(ex_array,3,2) = 'IN' OR substr(ex_array,5,2) = 'IN' OR substr(ex_array,7,2) = 'IN' OR substr(ex_array,9,2) = 'IN' OR substr(ex_array,11,2) = 'IN' )  
OR ( substr(ex_array,1,2) = 'IK' OR substr(ex_array,3,2) = 'IK' OR substr(ex_array,5,2) = 'IK' OR substr(ex_array,7,2) = 'IK' OR substr(ex_array,9,2) = 'IK' OR substr(ex_array,11,2) = 'IK' )  
OR ( substr(ex_array,1,2) = 'IH' OR substr(ex_array,3,2) = 'IH' OR substr(ex_array,5,2) = 'IH' OR substr(ex_array,7,2) = 'IH' OR substr(ex_array,9,2) = 'IH' OR substr(ex_array,11,2) = 'IH' )  
OR ( substr(ex_array,1,2) = 'KP' OR substr(ex_array,3,2) = 'KP' OR substr(ex_array,5,2) = 'KP' OR substr(ex_array,7,2) = 'KP' OR substr(ex_array,9,2) = 'KP' OR substr(ex_array,11,2) = 'KP' )  
)
4

4 回答 4

3

您可以尝试的一件事是使用基于函数的 index。具体来说,在 substr(ex_array,3,2) 和 substr(ex_array,9,2) 等上创建基于函数的索引。

虽然它可能有很多索引,所以你必须通过运行一些测试来衡量它有多大帮助。但这是一个开始的想法。

我假设您使用的是 8i 或更高版本。

于 2012-04-19T19:44:02.890 回答
1

也许使用regexp_like

REGEXP_LIKE(ex_array, '^(.{2}){0,5}(FW|IL|IN|IK|IH|KP).*$')

(正则表达式可能可以写得更好......)

您还可以按照dcp的建议添加基于函数的索引(尽管您只需要一个):

create index fbIndex on service_x (REGEXP_INSTR(ex_array, '^(.{2}){0,5}(FW|IL|IN|IK|IH|KP).*$'));

并更改要使用的查询:

REGEXP_INSTR(ex_array, '^(.{2}){0,5}(FW|IL|IN|IK|IH|KP).*$') = 1
于 2012-04-19T20:36:21.440 回答
1

这个结构怎么样...

INSTR( ex_array, 'FW' ) IN (1,3,5,7,9,11)

那么至少你只会做一次字符串解析......

于 2012-04-19T20:01:47.910 回答
0

鉴于我建议的可用信息,鉴于您需要的查询的选择性:

1) ex_array 上的索引(最好只是 ex_array,或者 ex_array 在索引的前沿。

2)修改查询。如果您附加其他过滤条件:

... 和 (Ex_array like '%FW%' OR ex_array like '%IL%' or ex_aray like .... 等涵盖了六种情况中的每一种。有了索引,这应该启用索引范围扫描以减少1220 万行只包含您感兴趣的六个字符串之一。只有这些行才会应用您的 substr 逻辑,留下预期的 175K。

原则上,这应该会提高效率。不过,它确实很大程度上取决于数据分布(例如,所有 1200 万行都可能包含六个字符串之一,只是不在原始查询中指定的位置。在这种情况下,我建议的更改可能比原始的效率低询问)。可能还有其他选择,但我需要更多信息,包括更准确地解释计划。

希望这有帮助,祝你好运!!

于 2012-04-20T20:32:49.297 回答