sql - 如何提高“LIKE”链接的 LEFT JOIN (Oracle SQL) 的性能
问题描述
我在使用 LIKE 进行连接的连接性能方面遇到了一些问题。下面描述了一个示例设置。Table1 在一天中增长到几千行。Table2 是一个查找表,大小不变,只有几十个条目。随着更多数据被添加到 Table1,查询性能会大幅恶化,以至于它实际上变得无法使用。
我有索引Table1.Entity
和Table2.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;
解决方案
查询的最佳结果是对表 1 的全表扫描和对表 2 的嵌套循环。
这是因为您必须检查 t1 中的每个条目是否与 t2 中的任何条目匹配。
T2 喜欢
---------------------------------
EntityJoin | JoinName
---------------------------------
An% | SomeVal
A% | SomeVal
AnE% | SomeOtherVal
---------------------------------
将是可能的和条目:
AnEntity1
AnEntity2
会三倍。
所以你必须考虑可以做些什么来更有选择性。
推荐阅读
- android - AndroidStudio 播放按钮:INSTALL_PARSE_FAILED_NO_CERTIFICATES
- r - 获取 dplyr 中每个 dyad 的目标数据
- c++ - 如何在 Unreal 蓝图中创建等效的 Unity LookAt?
- php - CodeIgniter 4 ... documentRoot 不公开... htaccess 不工作
- linux - 转移到 DARwIN-OP 时出现很多错误
- c++ - 有没有办法可以在“.structurevariable”前面放置一个字符串数组成员?
- javascript - window.prompt 安全吗?
- c# - Arduino c# application light led stop led with c#
- c# - 清洁架构中业务逻辑实现的困惑
- javascript - 如何获取两个日期之间的日期数组?