Otimize a consulta de junção de várias tabelas

pszafer

Tenho tabelas conectadas entre si por chaves estrangeiras (postgresql 13.1).

order: order_id, name
sub_order: mainorder, order_id (foreign key to order), detail
task_group: id, group_name
tasks: id, taskname, task_group_id (foregin key to group_name)
task_kind: id, kind_name
task_task_kind: id, kind_id(fk to task_kind), task_id (fk to task)
time_per_project: person, start_time, stop_time, part, order_id (foreign key to sub_order), 

Espero ter descrito o suficiente. Minha consulta por visualização materializada é a seguinte e funciona muito bem:

SELECT
  so.order_id AS order_id,
  MIN(so.status) AS status_id,
  SUM(AGE(tpp.stop_time, tpp.start_time)) AS total,
  SUM(
    CASE WHEN (tasksgroups.id = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS srut,
  SUM(
    CASE WHEN (tpp.valve_part_id = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS korpus,
  SUM(
    CASE WHEN (tasks_with_kinds.task_kind = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS zwykle,
  SUM(
    CASE WHEN (tasks_with_kinds.task_kind = 6) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS wyprawki
FROM
  intranet.sub_orders so
  LEFT JOIN intranet.time_per_project tpp ON so.mainorder = tpp.project_id
  LEFT JOIN intranet.task_task_kind tasks_with_kinds ON tasks_with_kinds.id = tpp.task
  LEFT JOIN intranet.task tasks ON tasks.id = tasks_with_kinds.task_id
  LEFT JOIN intranet.task_group tasksgroups ON tasksgroups.id = tasks.task_group
GROUP BY
  so.order_id
HAVING (SUM(AGE(tpp.stop_time, tpp.start_time)) > interval '0 minutes');

Quero adicionar outra junção com a tabela da seguinte maneira:

article_group: id, group_name
article_cost: id, group_id (fk to article_group), order_id (fk to sub_orders)

Acabei com o join na subconsulta, pois para alguns projetos contava a mesma linha duas ou mais vezes

SELECT
  so.order_id AS order_id,
  MIN(so.status) AS status_id,
  SUM(AGE(tpp.stop_time, tpp.start_time)) AS total,
  SUM(
    CASE WHEN (tasksgroups.id = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS srut,
  SUM(
    CASE WHEN (tpp.valve_part_id = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS korpus,
  SUM(
    CASE WHEN (tasks_with_kinds.task_kind = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS zwykle,
  SUM(
    CASE WHEN (tasks_with_kinds.task_kind = 6) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS wyprawki,
  ac.transport,
  ac.service
FROM
  intranet.sub_orders so
  LEFT JOIN intranet.time_per_project tpp ON so.mainorder = tpp.project_id
  LEFT JOIN intranet.task_task_kind tasks_with_kinds ON tasks_with_kinds.id = tpp.task
  LEFT JOIN intranet.task tasks ON tasks.id = tasks_with_kinds.task_id
  LEFT JOIN intranet.task_group tasksgroups ON tasksgroups.id = tasks.task_group
  LEFT JOIN (
    SELECT
      soa.order_id AS ordid,
      sum(
        CASE WHEN group_id = 14 THEN
          COST
        END) AS transport,
      sum(
        CASE WHEN group_id = 11 THEN
          COST
        END) AS service
    FROM
      intranet.article_costs
      INNER JOIN intranet.sub_orders soa ON soa.mainorder = project_id
    GROUP BY
      soa.order_id) ac ON ac.ordid = so.order_id
WHERE order_id = 2074
GROUP BY
  so.order_id, ac.transport, ac.service
HAVING (SUM(AGE(tpp.stop_time, tpp.start_time)) > interval '0 minutes' OR ac.transport > 0 or ac.service > 0);

Gostaria de saber se você acha que esta consulta por visualização materializada está ok? Se verdadeiro, é possível obter o mesmo comportamento sem ter uma subconsulta com junção aninhada nela?

letronas

Sobre o mesmo comportamento sem subconsulta

WITH ac as(
SELECT
      soa.order_id AS ordid,
      sum(
        CASE WHEN group_id = 14 THEN
          COST
        END) AS transport,
      sum(
        CASE WHEN group_id = 11 THEN
          COST
        END) AS service
    FROM
      intranet.article_costs
      INNER JOIN intranet.sub_orders soa ON soa.mainorder = project_id
    GROUP BY
      soa.order_id
)

SELECT
  so.order_id AS order_id,
  MIN(so.status) AS status_id,
  SUM(AGE(tpp.stop_time, tpp.start_time)) AS total,
  SUM(
    CASE WHEN (tasksgroups.id = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS srut,
  SUM(
    CASE WHEN (tpp.valve_part_id = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS korpus,
  SUM(
    CASE WHEN (tasks_with_kinds.task_kind = 1) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS zwykle,
  SUM(
    CASE WHEN (tasks_with_kinds.task_kind = 6) THEN
      AGE(tpp.stop_time, tpp.start_time)
    END) AS wyprawki,
  ac.transport,
  ac.service
FROM
  intranet.sub_orders so
  LEFT JOIN intranet.time_per_project tpp ON so.mainorder = tpp.project_id
  LEFT JOIN intranet.task_task_kind tasks_with_kinds ON tasks_with_kinds.id = tpp.task
  LEFT JOIN intranet.task tasks ON tasks.id = tasks_with_kinds.task_id
  LEFT JOIN intranet.task_group tasksgroups ON tasksgroups.id = tasks.task_group
  LEFT JOIN ac ON ac.ordid = so.order_id
WHERE order_id = 2074
GROUP BY
  so.order_id, ac.transport, ac.service
HAVING (SUM(AGE(tpp.stop_time, tpp.start_time)) > interval '0 minutes' OR ac.transport > 0 or ac.service > 0);

Gostaria de saber se você acha que esta consulta por visualização materializada está ok?

Se os dados ou o tempo da consulta forem muito grandes - use materializar (mas antes - otimize a consulta).

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Consulta de junção de várias tabelas SQL

Junção interna de várias tabelas na consulta mysql

Otimize várias junções de consulta MySQL para verificar a mesma sinalização em cada tabela

Junção condicional de várias tabelas

Junção condicional de várias tabelas

Consulta de exclusão inconsistente com junção à esquerda de várias tabelas

Visão Mysql com resultados de junção de várias tabelas em consulta lenta

A junção à esquerda de várias tabelas demora muito, abaixo da consulta.

Consulta SQL de várias tabelas - as junções não funcionam

Consultando várias tabelas, sendo duas tabelas de junção

Consulta de tabelas de junção JPA

Otimize a consulta de auto-junção do MySQL

Várias instruções de junções / consulta de várias tabelas

Otimize a consulta de agregação

Otimize a consulta de atualização

Subconsulta SQL de junção de várias tabelas

em vez de buscar várias tabelas usando pyspark, como podemos executar a consulta de junção usando jdbc

Execução de consulta lenta juntando várias tabelas

otimize a consulta linq com várias instruções de inclusão

Entity Framework: usando várias tabelas de junção

MySQL conta linhas de várias tabelas usando junção

Laravel eloquent várias tabelas de junção com filtro

Entity Framework: usando várias tabelas de junção

Otimize a consulta MySQL usando várias junções por ordem na tabela de log para encontrar o melhor diff (melhores registros)

Obtenha valores exclusivos de várias tabelas usando junções de construtor de consulta

Consulta sql completa de várias tabelas

Consulta de acesso a várias tabelas

Consulta de várias tabelas Java JOOQ

Loop de consulta em várias tabelas

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  3. 3

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  4. 4

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  5. 5

    Gerenciar recurso shake de Windows Aero com barra de título personalizado

  6. 6

    Como obter dados API adequados para o aplicativo angular?

  7. 7

    UITextView não está exibindo texto longo

  8. 8

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  9. 9

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  10. 10

    Usando o plug-in Platform.js do Google

  11. 11

    Como posso modificar esse algoritmo de linha de visada para aceitar raios que passam pelos cantos?

  12. 12

    Dependência circular de diálogo personalizado

  13. 13

    Coloque uma caixa de texto HTML em uma imagem em uma posição fixa para site para desktop e celular

  14. 14

    iOS: como adicionar sombra projetada e sombra de traço no UIView?

  15. 15

    Como usar a caixa de diálogo de seleção de nomes com VBA para enviar e-mail para mais de um destinatário?

  16. 16

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  17. 17

    How to create dynamic navigation menu select from database using Codeigniter?

  18. 18

    Converter valores de linha SQL em colunas

  19. 19

    ChartJS, várias linhas no rótulo do gráfico de barras

  20. 20

    用@StyleableRes注释的getStyledAttributes。禁止警告

  21. 21

    não é possível adicionar dependência para com.google.android.gms.tasks.OnSuccessListener

quentelabel

Arquivo