С сегодняшнего дня задание Bigquery внезапно начало давать сбой из-за связанного подзапроса - PullRequest
0 голосов
/ 09 мая 2020

Задание My Bigquery, которое до вчерашнего дня выполнялось нормально, начало давать сбой из-за ошибки ниже.

Ошибка: - Коррелированные подзапросы, которые ссылаются на другие таблицы, не поддерживаются, если их нельзя отделить, например, преобразовав их в эффективный запрос JOIN

: -

with result as (
  select
    *
  from
  (
    select * from `project.dataset_stage.=non_split_daily_temp`
    union all
    select * from `project.dataset_stage.split_daily_temp`
  )
)
select
  *
from
  result final
where
  not (
    exists
    (
      select
        1
      from
        `project.dataset.bqt_sls_cust_xref` target
      where
        final.sls_dte = target.sls_dte and
        final.str_id = target.str_id and
        final.rgs_id = target.rgs_id and
    ) and
    was_unlinked_run = 'Y' and
    is_card_matched = 'Y'
  )

Может ли кто-нибудь помочь мне в этом, я хотел бы знать причину внезапного прерывания этого и как исправить эту проблему навсегда.

Ответы [ 2 ]

1 голос
/ 14 мая 2020

Спасибо за предложение.

Мы выяснили причину проблемы, ниже приводится причина

Когда кто-то пишет коррелированный подзапрос, например

select T2.col, (select count(*) from T1 where T1.col = T2.col) from T2

Технически SQL text подразумевает, что подзапрос необходимо повторно выполнить для каждой строки из T2. Если T2 имеет миллиард строк, нам нужно будет сканировать T1 миллиард раз. Это займет вечность, и запрос никогда не завершится. sh.

Стоимость выполнения запроса снизилась с O (размер T1 * размер T2) до O (размер T1 + размер T2), если реализовано, как показано ниже

select any_value(t.col), count(*) from
t left join T1 on T1.col = t.col
group by t.primary_key````

BigQuery errors out if it can't find a way to optimize correlated subquery into linear cost O(size T1 + size T2).

We have plenty of patterns that we recognize and we rewrite for correlated subqueries but apparently new view definition made subquery too complex and query optimizer was unable find a way to run it in linear complexity algorithm.

Probably google will fix the issue by identifying the better algorithm. 

0 голосов
/ 10 мая 2020

Не знаю, почему он внезапно сломался, но, похоже, ваш запрос можно переписать на OUTER JOIN:

with result as (
  select
    *
  from
  (
    select * from `project.dataset_stage.=non_split_daily_temp`
    union all
    select * from `project.dataset_stage.split_daily_temp`
  )
)
select
  *
from
  result final LEFT OUTER JOIN `project.dataset.bqt_sls_cust_xref` target
                          ON final.sls_dte = target.sls_dte and
                             final.str_id = target.str_id and
                             final.rgs_id = target.rgs_id
where
    target.<id_column> IS NULL AND -- No join found, equivalent to NOT (HAVING (<correlected sub-query>)) 
    was_unlinked_run = 'Y' and
    is_card_matched = 'Y'
  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...