Запрос BigQuery чрезвычайно медленный при добавлении СОЕДИНЕНИЯ

#sql #performance #join #google-bigquery

#sql #Производительность #Присоединиться #google-bigquery

Вопрос:

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

Я начал изучать SQL с нуля около трех недель назад, и поэтому я довольно новичок во всей концепции и сообществе, и поэтому я, вероятно, допустил много ошибок в своем коде, но вот что происходит.

Я борюсь с запросом, который я пишу в BigQuery. «Валидатор» BigQuery проверил код, поэтому на «бумаге» это кажется хорошим, но для запуска требуется вечность. Он выполняется до такой степени, что я останавливаю его, потому что прошел час. Я искал способы оптимизации своего sql-кодирования, чтобы процессы могли выполняться более плавно и, следовательно, быстрее, но я уперся в стену, где, я думаю, у меня нет вопросов, которые могли бы дать мне полезный ответ.

(Редактировать) Чего я не хочу от этого запроса, так это набора данных, который может помочь мне создать визуализацию, создающую временную шкалу на основе дат / временных меток, которые предоставляет read_started_at. На этой временной шкале я хочу получить отчетливое количество идентификаторов reader_id за данный день / DATE_TRUNC (временная метка). Google Data Studio может сделать отдельный подсчет идентификаторов reader_id, поэтому я сомневаюсь, будет ли выполнение отдельного подсчета в моем запросе замедлять или ускорять процесс в долгосрочной перспективе? Наконец, я хочу разделить reader_id на две группы (измерения) в зависимости от того, подписаны ли они на ежемесячную или годовую подписку, чтобы узнать, больше ли одна группа представлена на данном read_started_at и, следовательно, более активна на веб-сайте, чем другая. Предполагается, что это разделение обеспечивается chargebee_plan_id, где доступно несколько подписок, поэтому существует условие «ежегодно» или «ежемесячно». Reader_id и membership_id содержат одни и те же данные и поэтому ОБЪЕДИНЯЮТСЯ. (Конец редактирования)

Я действительно надеюсь, что кто-нибудь здесь сможет мне помочь. Приветствуются любые советы.

Мой запрос следующий:

 WITH memberships AS (
        SELECT im.chargebee_plan_id, im.membership_id
        FROM postgres.internal_reporting_memberships AS im 
        WHERE (im.chargebee_plan_id LIKE 'yearly' OR im.chargebee_plan_id LIKE 'monthly') 
          AND  im.started_at >= TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 365 day)
                    ),

     readers AS     (       
        SELECT  ip.reader_id, DATE_TRUNC(CAST(ip.read_started_at AS DATE), DAY) read_start
        FROM postgres.internal_reporting_read_progresses AS ip 
        WHERE ip.reader_id LIKE '%|%' AND ip.read_started_at >= (TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 365 day)
                    ))

SELECT  reader_id, read_start, m.chargebee_plan_id
FROM    readers AS r
  JOIN memberships AS m
  ON r.reader_id LIKE m.membership_id
  

Приветствия

Комментарии:

1. Предоставьте образцы данных, желаемые результаты и объяснение того, что вы хотите сделать.

2. Измените join на use = вместо LIKE , если это возможно. Это может означать приведение ваших _id столбцов внутри CTE, если они имеют разные типы данных.

3. Теперь вопрос отредактирован. Спасибо за помощь @GordonLinoff

4. И СПАСИБО @rtenha ! Это сработало!

Ответ №1:

Повторная публикация моего комментария в качестве ответа, поскольку это решило проблему.

Используйте = вместо a LIKE для условия соединения.