Мой босс хочет, чтобы я присоединился к трем столам, назовем их tableA
, tableB
, tableC
, которые имеют соответственно 74M, 3M и 75M строк.Считает ли count() базовую таблицу, которую она должна учитывать?
В случае, если это полезно, запрос выглядит следующим образом:
SELECT A.*,
C."needed_field"
FROM "tableA" A
INNER JOIN (SELECT "field_join_AB", "field_join_BC" FROM "tableB") B
ON A."field_join_AB" = B."field_join_AB"
INNER JOIN (SELECT "field_join_BC", "needed_field" FROM "tableC") C
ON B."field_join_BC" = C."field_join_BC"
При попытке запроса на Dataiku Data Science Studio
+ Vertica
, это, кажется, создает временные данные для получения выходного сигнала, который заполняет вверх 1T пространства на сервер, раздувая его.
Мой босс мало знает о SQL, поэтому он не понимает, что в худшем случае он может создать таблицу с 74M * 3M * 75M = 1.6 * 10^19 строк, возможно, являющуюся проблемой здесь (и я совершенно новый, и я пока не знаю данных, поэтому не знаю, может ли запрос произвести столько строк или нет).
Поэтому я хотел бы знать, если у меня есть способ узнать заранее, сколько строк будет производиться: если я сделал COUNT()
, такие как это, например:
SELECT COUNT(*)
FROM "tableA" A
INNER JOIN (SELECT "field_join_AB", "field_join_BC" FROM "tableB") B
ON A."field_join_AB" = B."field_join_AB"
INNER JOIN (SELECT "field_join_BC", "needed_field" FROM "tableC") C
ON B."field_join_BC" = C."field_join_BC"
производит ли базовый двигатель весь набор данных, а затем подсчитывает его? (что означало бы, что я не могу сосчитать это заранее, по крайней мере, не так).
Возможно ли, что результат COUNT()
дает мне результат? (Потому что он не строит набор данных, но работает это какой-то другой путь)
(NB: Я в настоящее время тестирования, но граф был запущен на 35 млн сейчас)
«Создает ли базовый двигатель весь набор данных, а затем подсчитывает его?» Может быть - это зависит от того, какой план создает двигатель. SQL - декларативный язык; вы говорите ему, что хотите, и двигатель решает, как его производить. Если в столбце объединения есть индексы, может не потребоваться отсканировать все данные. –
Очень маловероятно, что есть индексы (и я не могу проверить, у меня нет доступа непосредственно к интерфейсу Vertica ...).Если мы предположим, что нет индексов, он должен проверять данные точно? –
Ну, да, потому что он должен найти все соответствующие строки в каждой таблице. –