SQL Like Operator 在 AWS Athena 中从另一个 table 使用时非常慢
SQL Like Operator very slow when using from Another table in AWS Athena
我在 athena 中有 SQL 查询,当使用来自另一个 table
的 like 运算符值时,它非常慢
Select * from table1 t1
Where t1.value like (select
concat('%',t2.value,'%') as val
from table2 t2 where t2.id =1
limit 1)
上面的查询很慢
当我使用类似下面的查询时,它的工作速度超快
Select * from table1 t1
Where t1.value like
'%somevalue%'
在我的场景中,like 值不是固定的,它可以随时更改,这就是为什么我需要使用另一个 table.
的值
请建议最快的方式
“慢”是一个相对术语,但连接两个 table 的查询总是比不连接的查询 慢 。与需要在查询时在另一个 table 中查找的模式进行比较的查询总是比使用静态模式的查询 慢 。
这是否意味着第二个查询很慢?也许可以,但是您必须基于您实际要求查询引擎执行的操作。
让我们分析一下您的查询在做什么:
- 外部查询查找第一个 table 的所有行的所有列,其中一列包含特定字符串。
- 通过 扫描第二个 table 中的每一行以查找具有
id
列的特定值的行来动态查找该字符串。
换句话说,第一个查询仅扫描第一个 table,而第二个查询扫描两个 table。这总是会变慢,因为它做了更多的工作。还有多少工作?这取决于 table 的大小。您没有指定任何查询的 运行 次或 table 的大小,因此很难知道。
您没有在问题中提供足够的上下文来回答比这更准确的问题。我们只能笼统地回应:如果它很慢,那么不要使用 LIKE
,那是一个缓慢的操作。不要执行读取整个秒的相关子查询 table,那很慢。
我已经找到了相同的其他方法,并且在 Athena 中速度超级快
Select * from table1 t1
Where POSITION ( (select concat('%',t2.value,'%') as val from table2 t2 where t2.id =1 limit 1) in t1.value )>0
我在 athena 中有 SQL 查询,当使用来自另一个 table
的 like 运算符值时,它非常慢Select * from table1 t1
Where t1.value like (select
concat('%',t2.value,'%') as val
from table2 t2 where t2.id =1
limit 1)
上面的查询很慢
当我使用类似下面的查询时,它的工作速度超快
Select * from table1 t1
Where t1.value like
'%somevalue%'
在我的场景中,like 值不是固定的,它可以随时更改,这就是为什么我需要使用另一个 table.
的值请建议最快的方式
“慢”是一个相对术语,但连接两个 table 的查询总是比不连接的查询 慢 。与需要在查询时在另一个 table 中查找的模式进行比较的查询总是比使用静态模式的查询 慢 。
这是否意味着第二个查询很慢?也许可以,但是您必须基于您实际要求查询引擎执行的操作。
让我们分析一下您的查询在做什么:
- 外部查询查找第一个 table 的所有行的所有列,其中一列包含特定字符串。
- 通过 扫描第二个 table 中的每一行以查找具有
id
列的特定值的行来动态查找该字符串。
换句话说,第一个查询仅扫描第一个 table,而第二个查询扫描两个 table。这总是会变慢,因为它做了更多的工作。还有多少工作?这取决于 table 的大小。您没有指定任何查询的 运行 次或 table 的大小,因此很难知道。
您没有在问题中提供足够的上下文来回答比这更准确的问题。我们只能笼统地回应:如果它很慢,那么不要使用 LIKE
,那是一个缓慢的操作。不要执行读取整个秒的相关子查询 table,那很慢。
我已经找到了相同的其他方法,并且在 Athena 中速度超级快
Select * from table1 t1
Where POSITION ( (select concat('%',t2.value,'%') as val from table2 t2 where t2.id =1 limit 1) in t1.value )>0