首页 > 解决方案 > 如何提高“LIKE”链接的 LEFT JOIN (Oracle SQL) 的性能

问题描述

我在使用 LIKE 进行连接的连接性能方面遇到了一些问题。下面描述了一个示例设置。Table1 在一天中增长到几千行。Table2 是一个查找表,大小不变,只有几十个条目。随着更多数据被添加到 Table1,查询性能会大幅恶化,以至于它实际上变得无法使用。

我有索引Table1.EntityTable2.EntityJoin

我以这种方式构建了表,使用通配符EntityJoin值,因此前端可以定义将相似实体名称映射到特定组的过滤器。在我看来,从用户的角度来看,能够使用通配符而不是必须在表 2 中定义表 1 中的每个实体名称会更有效(请注意,此结构是为了示例而大大简化的视图)。

我已经阅读了一些关于加入性能的类似帖子,但没有看到任何以我尝试使用它的方式使用 LIKE 的帖子。

表格1:

------------------------
Entity
------------------------
AnEntity1
AnEntity2
OtherEntity1
Other3Entity
Other12Entity
MoreEntities2
EvenMore3Entities5
------------------------

表2:

---------------------------------
EntityJoin     | JoinName
---------------------------------
An%            | SomeVal
Other%         | SomeVal
More%          | SomeOtherVal
---------------------------------

询问

select 
    *
from
    Table1 T1
    left join Table2 T2
        on T1.Entity like T2.EntityJoin;

标签: sqloracleleft-join

解决方案


查询的最佳结果是对表 1 的全表扫描和对表 2 的嵌套循环。

这是因为您必须检查 t1 中的每个条目是否与 t2 中的任何条目匹配。

T2 喜欢

---------------------------------
EntityJoin     | JoinName
---------------------------------
An%            | SomeVal
A%             | SomeVal
AnE%           | SomeOtherVal
---------------------------------

将是可能的和条目:

AnEntity1
AnEntity2

会三倍。

所以你必须考虑可以做些什么来更有选择性。


推荐阅读