如何提高';比如'-链接左联接(Oracle SQL)

如何提高';比如'-链接左联接(Oracle SQL),sql,oracle,left-join,Sql,Oracle,Left Join,我对使用LIKE进行连接的连接的性能有一些问题。下面描述了一个示例设置。表1在一天的时间内增长到几千行。表2是一个查找表,大小不变,只有几十个条目。随着越来越多的数据添加到表1中,查询性能急剧恶化,以至于变得实际上无法使用 我在表1.Entity和表2.EntityJoin 我用通配符EntityJoin值以这种方式构建表,这样前端就可以定义过滤器,将相似的实体名称映射到特定的组。在我看来,从用户的角度来看,能够使用通配符比必须从表2中的表1中定义每个实体名称更有效(注意,为了示例起见,此结构是

我对使用LIKE进行连接的连接的性能有一些问题。下面描述了一个示例设置。表1在一天的时间内增长到几千行。表2是一个查找表,大小不变,只有几十个条目。随着越来越多的数据添加到表1中,查询性能急剧恶化,以至于变得实际上无法使用

我在
表1.Entity
表2.EntityJoin

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

我已经阅读了一些关于join performance的类似帖子,但没有看到任何类似的使用方式

表1:

------------------------
Entity
------------------------
AnEntity1
AnEntity2
OtherEntity1
Other3Entity
Other12Entity
MoreEntities2
EvenMore3Entities5
------------------------
表2:

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


您对查询的最佳期望是 表1上的完整表扫描 和表2的嵌套循环

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

T2样

---------------------------------
EntityJoin     | JoinName
---------------------------------
An%            | SomeVal
A%             | SomeVal
AnE%           | SomeOtherVal
---------------------------------
可能会出现以下情况:

AnEntity1
AnEntity2
将增加三倍


因此,您必须考虑可以做些什么来更具选择性。

您对查询的最佳期望是 表1上的完整表扫描 和表2的嵌套循环

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

T2样

---------------------------------
EntityJoin     | JoinName
---------------------------------
An%            | SomeVal
A%             | SomeVal
AnE%           | SomeOtherVal
---------------------------------
可能会出现以下情况:

AnEntity1
AnEntity2
将增加三倍


因此,您必须考虑可以做些什么来提高选择性。

每天几千行?这大约是每年200-300万行,这对于Oracle DB来说根本算不上什么。即使您想做类似的事情,也应该查看表分区,而不是创建单独的表。至于性能-很可能您在
表1
上没有适当的索引。不管怎样,很难说清楚,如果你向我们展示了你对“代码> >表1<代码>的查询,你认为是慢的。你能给我们看一下解释计划和任何索引定义吗?你不能避免第一次完整的扫描,但是你可以以某种方式“裁剪”。执行时间如果您将EntityJoin筛选器按长度排序,因为限制性更强的筛选器将首先运行,然后我才开始执行
解释计划
。计划表中的哪些列可用于在此处共享?存储实体连接低值和高值,如
anaaaaa
anzzzzz
。然后在T2.EntityJoinlow和T2.EntityJoinhigh之间的T1.Entity上加入
。每天几千行?这大约是每年200-300万行,这对于Oracle DB来说根本算不上什么。即使您想做类似的事情,也应该查看表分区,而不是创建单独的表。至于性能-很可能您在
表1
上没有适当的索引。不管怎样,很难说清楚,如果你向我们展示了你对“代码> >表1<代码>的查询,你认为是慢的。你能给我们看一下解释计划和任何索引定义吗?你不能避免第一次完整的扫描,但是你可以以某种方式“裁剪”。执行时间如果您将EntityJoin筛选器按长度排序,因为限制性更强的筛选器将首先运行,然后我才开始执行
解释计划
。计划表中的哪些列可用于在此处共享?存储实体连接低值和高值,如
anaaaaa
anzzzzz
。然后在T2.EntityJoinlow和T2.EntityJoinhigh之间的T1.Entity上加入