У меня есть таблица с 50+ миллионами записей с этой структурой:
sku STRING,
sale_net STRING,
sold_amount FLOAT64,
dt DATE,
is_promo BOOL
Мне нужно выбрать из него записи с sku
и sale_nets
, у которых было is_promo = true
хотя бы один раз.
Например, если в таблице только 3 записи:
sku1 sn1 123 01.01.2018 false
sku1 sn1 456 02.01.2018 true
sku2 sn1 321 01.01.2018 false //this sku-sale_net pair don't have is_promo = true records at other dates
По моему запросу должны быть выбраны только первые два.
Я пишу этот запрос:
select *
from src_tbl tbl1
where (select count(*)
from src_tbl tbl2
where tbl1.sku = tbl2.sku
and tbl1.sale_net = tbl2.sale_net
and is_promo = true) > 0;
Но он не выполняется на больших базах данных из-за чрезмерного использования ресурса:
Resources exceeded during query execution: The query could not be executed in the allotted memory. Peak usage: 105% of limit. Top memory consumer(s): aggregate functions and GROUP BY clauses: 93% other/unattributed: 7%
Можно ли оптимизировать мой запрос и как?