Оптимизация запроса Hive с помощью UNION ALL и RANK с порядком

Текущий сценарий: У меня есть этот запрос, который объединяет все два набора данных, а затем выбирает поля на основе ранга. Но согласно моему анализу весь набор данных может быть удален с одной стороны UNION.

Анализ: Итак, если вы посмотрите на приведенный ниже запрос, я думаю, что мы можем полностью игнорировать и удалить набор данных, созданный объединением таблиц: P, Q, R, S и T.

также могу ли я заменить unionall на union здесь

Запрос:

SELECT OUTERV.f1, ... OUTERV.f30
FROM 
      (
        SELECT 
          unionV.f1, ...unionV.f30, ROW_NUMBER() over (PARTITION BY unionV.ifc order by  unionV.orderNUM_ asc) rank_
        FROM 
          (
            SELECT f1 .. few fields, 1 as ORDERNUM_ 
            FROM 
            A 
            JOIN B on A.id = B.id 
            JOIN ( SELECT few remaining fields FROM C )  
            C ON C.id = B.id
            JOIN D ON C.id = D.id
            JOIN E ON E.id = D.id
            JOIN F on F.id = E.id
            UNION ALL 
            SELECT 
              f1, f2, ...f30 , 2 as ORDERNUM_ 
            FROM 
            P 
            JOIN Q ON P.id = Q.id
            JOIN R ON Q.id = R.id
            JOIN S on S.id = R.id
            JOIN T on S.id = T.id

          )unionV
      ) 
OUTERV where 
OUTERV.rank_ = 1

Запрос: Пожалуйста, подтвердите правильность моего анализа.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
0
289
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не согласен с Анализом; он делает предположения, которые могут быть неверными. Однако если вы можете гарантировать, что все значения IFC во второй части объединения существуют в первой части объединения, и это ВСЕГДА так, то ваш анализ верен.

Essentially what the query you have does is trust the data from the first set of the union more than the second set of the union. However, if there is an IFC value in the second set not in the first; it must come from the 2nd part of the union; thus removing the second part of the union could remove records.

Пример:

  • Предположим, что unionV.ifc получен из таблиц A и P на каждой стороне соединения.
  • Предположим, что следующие данные в A и P

.

A.ifc
A
B

P.ifc
A
Z

В вашем текущем запросе результаты будут

A (from A table)
B (from A table)
Z (from P Table)  

Если вы исключите 2-ю часть объединения, вы удалите P, и поэтому Z будет исключен из результатов; следовательно, они не равны, и вы не можете удалить вторую часть союза.

Теперь, если все ifc, определенные во втором наборе, содержатся в первом наборе, определенном объединениями, и это ВСЕГДА верно; тогда да, вы могли бы исключить 2-ю часть союза. Так как первый набор содержит в первую очередь полный комплект. Однако, если это не гарантированно верное утверждение, то текущий подход, использующий объединение на... F и P... T, генерирует "главный набор"

Да . Теперь я понял, что вы говорите. большое, большое спасибо за ваше подробное объяснение. В этом случае UNION также продлит время выполнения, union-all имеет больше смысла. этот запрос теперь выглядит в значительной степени настроенным, и нет места для оптимизации.

Vidya K 04.04.2019 18:38

Союз все в порядке. Union устранит только дубликаты, существующие в каждом наборе. но моя точка зрения была больше связана с потерей записей из второго набора данных, определенного объединением, если не из первого набора, определенного объединением.

xQbert 04.04.2019 19:52

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

Vidya K 05.04.2019 08:22

Другие вопросы по теме