我有两个数据库,每个数据库都包含一个表,该表存储在一个S3文件中,如:大小~83MB的part-00000-77654909-37c7-4c9e-8840-b2838792f98d-c000.snappy.orc
。
我正在尝试执行一个基元左联接查询:
select b.id
from "db-b".tbl b
left join "db-a".tbl a on (
b.id = a.id
or (
b.externalid__c is not null
and b.externalid__c = a.externalid__c
)
or (
b.externalid__c is null
and b.internalid__c = a.internalid__c
)
)
where a.id is null
30分钟后超时。
30分钟还不够加入两个83MB的文件吗?为什么?
这可以通过使用多个联接而不是单个联接条件来解决:
select b.id
from "db-b".tbl b
left join "db-a".tbl a1 on b.id = a.id
left join "db-a".tbl a2 on b.externalid__c is not null
and b.externalid__c = a.externalid__c
left join "db-a".tbl a3 on b.externalid__c is null
and b.internalid__c = a.internalid__c
where coalesce(a1.id, a2.id, a3.id) is null
它会运行几秒钟,正如你所期望的那样。
不知道为什么,但这里要提到OR
子句的一些优化困难:https://dba.stackexchange.com/questions/308080/presto-left-join-using-multiple-operators