Обмен FROM и INNER JOIN - PullRequest
       39

Обмен FROM и INNER JOIN

0 голосов
/ 20 июня 2020

У меня есть следующие два SQL запроса:

1.

"""
SELECT a.id, a.body, a.owner_user_id
FROM `bigquery-public-data.stackoverflow.posts_questions` AS q 
INNER JOIN `bigquery-public-data.stackoverflow.posts_answers` AS a
ON q.id = a.parent_id
WHERE q.tags LIKE '%bigquery%'
"""
"""
SELECT a.id, a.body, a.owner_user_id
FROM `bigquery-public-data.stackoverflow.posts_answers` AS a
INNER JOIN `bigquery-public-data.stackoverflow.posts_questions` as q
ON q.id = a.parent_id
WHERE q.tags LIKE "%bigquery%"
"""

Я знаю, что второй намного дороже. Я хочу знать, почему это так.

Мое предположение - Сначала извлекается 1 post_questions, и нам нужно l oop только для идентификаторов вопросов, но в 2 нам нужно l oop над родительскими идентификаторами ответа. Поскольку ответов намного больше, чем вопросов, второй оказывается дороже.

Я прав? Кроме того, правильно ли я предполагаю, что конечный результат двух запросов будет одинаковым?

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

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

BigQuery взимает плату за количество байтов, считываемых для обработки запроса, не от сложности запроса. Фактически, несколько ссылок на одну и ту же таблицу не влияют на цену. Однако количество столбцов, на которые ссылаются , не влияет на цену .

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

Вы Вы можете узнать, как BigQuery рассчитывает цены, в документации .

0 голосов
/ 20 июня 2020

Эти два запроса синтаксически эквивалентны (поэтому они дают одинаковые результаты). Я не знаю, почему вы думаете, что один из них дороже другого, но это определенно не так.

SQL - это описательный язык, в отличие от процедурный язык. Вы сообщаете базе данных желаемые результаты, и позволяете ей решать, как действовать дальше. Планировщик запросов анализирует запрос и вырабатывает план выполнения, который он считает лучшим. Он будет успешно "запускаться" из одной таблицы или из другой, независимо от порядка, в котором они появляются в запросе.

...