Tabelas derivadas no Looker

No Looker, uma tabela derivada é uma consulta cujos resultados são usados como se fossem uma tabela real no banco de dados.

Por exemplo, você pode ter uma tabela de banco de dados chamada orders com muitas colunas. Você quer calcular algumas métricas agregadas do cliente, como quantos pedidos cada cliente fez ou quando cada cliente fez o primeiro pedido. Usando uma tabela derivada nativa ou uma tabela derivada baseada em SQL, é possível criar uma nova tabela de banco de dados chamada customer_order_summary que inclui essas métricas.

Depois, você pode trabalhar com a tabela derivada customer_order_summary como se fosse qualquer outra no banco de dados.

Para ver casos de uso comuns de tabelas derivadas, acesse Livros de receitas do Looker: como aproveitar ao máximo as tabelas derivadas no Looker.

Tabelas derivadas nativas e baseadas em SQL

Para criar uma tabela derivada no projeto do Looker, use o parâmetro derived_table em um parâmetro visualização. No parâmetro derived_table, é possível definir a consulta para a tabela derivada de duas maneiras:

Por exemplo, os arquivos de visualização a seguir mostram como usar o LookML para criar uma visualização com base em uma tabela derivada customer_order_summary. As duas versões do LookML ilustram como criar tabelas derivadas equivalentes usando o LookML ou o SQL para definir a consulta da tabela derivada:

  • A tabela derivada nativa define a consulta com o LookML no parâmetro explore_source. Neste exemplo, a consulta é baseada em uma visualização orders existente, que é definida em um arquivo separado que não é mostrado neste exemplo. A consulta explore_source na tabela derivada nativa traz os campos customer_id, first_order e total_amount do arquivo de visualização orders.
  • A tabela derivada baseada em SQL define a consulta usando SQL no parâmetro sql. Neste exemplo, a consulta SQL é direta da tabela orders no banco de dados.
Versão da tabela derivada nativa
view: customer_order_summary {
  derived_table: {
    explore_source: orders {
      column: customer_id {
        field: orders.customer_id
      }
      column: first_order {
        field: orders.first_order
      }
      column: total_amount {
        field: orders.total_amount
      }
    }
  }
  dimension: customer_id {
    type: number
    primary_key: yes
    sql: ${TABLE}.customer_id ;;
  }
  dimension_group: first_order {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.first_order ;;
  }
  dimension: total_amount {
    type: number
    value_format: "0.00"
    sql: ${TABLE}.total_amount ;;
  }
}
Versão da tabela derivada com base em SQL
view: customer_order_summary {
  derived_table: {
    sql:
      SELECT
        customer_id,
        MIN(DATE(time)) AS first_order,
        SUM(amount) AS total_amount
      FROM
        orders
      GROUP BY
        customer_id ;;
  }
  dimension: customer_id {
    type: number
    primary_key: yes
    sql: ${TABLE}.customer_id ;;
  }
  dimension_group: first_order {
    type: time
    timeframes: [date, week, month]
    sql: ${TABLE}.first_order ;;
  }
  dimension: total_amount {
    type: number
    value_format: "0.00"
    sql: ${TABLE}.total_amount ;;
  }
}

Ambas as versões criam uma visualização chamada customer_order_summary, com base na tabela orders, com as colunas customer_id, first_order, e total_amount.

Além do parâmetro derived_table e dos subparâmetros, essa visualização customer_order_summary funciona como qualquer outro arquivo de visualização. Se você definir a consulta da tabela derivada com o LookML ou com o SQL, poderá criar medidas e dimensões do LookML com base nas colunas da tabela derivada.

Depois de definir a tabela derivada, você pode usá-la como qualquer outra tabela no seu banco de dados.

Tabelas derivadas nativas

As tabelas derivadas nativas são baseadas em consultas que você define usando termos do LookML. Para criar uma tabela derivada nativa, use o parâmetro explore_source dentro do parâmetro derived_table de uma visualização. Para criar as colunas da tabela derivada nativa, consulte as dimensões ou medidas do LookML no modelo. Consulte o arquivo de visualização de tabela derivada nativa no exemplo anterior.

Comparadas com as tabelas derivadas baseadas em SQL, as tabelas nativas são muito mais fáceis de ler e entender ao modelar seus dados.

Consulte a página de documentação Como criar tabelas derivadas nativas para saber como criar tabelas derivadas nativas.

Tabelas derivadas baseadas em SQL

Para criar uma tabela derivada baseada em SQL, defina uma consulta em termos SQL, criando colunas na tabela usando uma consulta SQL. Não é possível consultar as dimensões e medidas do LookML em uma tabela derivada baseada em SQL. Consulte o arquivo de visualização de tabela derivada com base em SQL no exemplo anterior.

Geralmente, você define a consulta SQL usando o parâmetro sql dentro do parâmetro derived_table de uma visualização.

Um atalho útil para criar consultas baseadas em SQL no Looker é usar o SQL Runner para criar a consulta SQL e transformá-la em uma definição de tabela derivada.

Alguns casos extremos não permitem o uso do parâmetro sql. Nesses casos, o Looker oferece suporte aos seguintes parâmetros para definir uma consulta SQL para tabelas derivadas persistentes (PDTs):

  • create_process: quando você usa o parâmetro sql para um PDT, o Looker no plano de fundo envolve a consulta CREATE TABLE Instrução de linguagem de definição de dados (DDL) do dialeto em volta da consulta para criar o PDT a partir da consulta SQL. Alguns dialetos não oferecem suporte a uma instrução CREATE TABLE SQL em uma única etapa. Para esses dialetos, não é possível criar um PDT com o parâmetro sql. Em vez disso, use o parâmetro create_process para criar um PDT em várias etapas. Consulte a página de documentação do parâmetro create_process para informações e exemplos.
  • sql_create: se o caso de uso exigir comandos DDL personalizados e o dialeto oferecer suporte a DDL (por exemplo, o BigQuery ML preditivo do Google), use o parâmetro sql_create para criar um PDT em vez de usar o parâmetro sql. Consulte a página de documentação do sql_create para informações e exemplos.

Seja qual for o parâmetro sql, create_process ou sql_create, em todos esses casos, você está definindo a tabela derivada com uma consulta SQL. Portanto, todas elas são consideradas tabelas derivadas baseadas em SQL.

Ao definir uma tabela derivada baseada em SQL, use AS para dar um alias limpo a cada coluna. Isso acontece porque você precisa fazer referência aos nomes das colunas do conjunto de resultados nas dimensões, como ${TABLE}.first_order. É por isso que o exemplo anterior usa MIN(DATE(time)) AS first_order em vez de MIN(DATE(time)).

Tabelas derivadas temporárias e persistentes

Além da distinção entre tabelas derivadas nativas e baseadas em SQL, há também uma distinção entre uma tabela derivada temporária, que não é gravada no banco de dados, e uma tabela derivada persistente (PDT, na sigla em inglês), que é gravada em um esquema no seu banco de dados.

As tabelas derivadas nativas e as baseadas em SQL podem ser temporárias ou permanentes.

Tabelas derivadas temporárias

As tabelas derivadas mostradas anteriormente são exemplos de tabelas derivadas temporárias. Elas são temporárias porque não há uma estratégia de persistência definida no parâmetro derived_table.

As tabelas derivadas temporárias não são gravadas no banco de dados. Quando um usuário executa uma consulta de Análise que envolve uma ou mais tabelas derivadas, o Looker cria uma consulta SQL usando uma combinação específica do dialeto do SQL para as tabelas derivadas, além dos campos, junções e valores de filtro solicitados. Se a combinação já tiver sido executada e os resultados ainda forem válidos no cache, o Looker vai usar os resultados em cache. Consulte a página de documentação Armazenamento em cache de consultas para mais informações sobre o armazenamento em cache de consultas no Looker.

Caso contrário, se o Looker não puder usar os resultados armazenados em cache, ele vai precisar executar uma nova consulta no seu banco de dados sempre que um usuário solicitar dados de uma tabela derivada temporária. Por isso, verifique se as tabelas derivadas temporárias têm bom desempenho e não sobrecarregam o banco de dados. Nos casos em que a consulta leva algum tempo para ser executada, uma PDT geralmente é uma opção melhor.

Dialetos de banco de dados compatíveis para tabelas derivadas temporárias

Para que o Looker ofereça suporte a tabelas derivadas no projeto, o dialeto do banco de dados também precisa oferecer suporte a elas. A tabela a seguir mostra quais dialetos oferecem suporte a tabelas derivadas na versão mais recente do Looker:

Dialeto Compatível?
Actian Avalanche
Sim
Amazon Athena
Sim
MySQL do Amazon Aurora
Sim
Amazon Redshift
Sim
Apache Druid
Sim
Apache Druid 0.13 ou mais recente
Sim
Apache Druid 0.18+
Sim
Apache Hive 2.3 ou mais recente
Sim
Apache Hive 3.1.2 ou mais recente
Sim
Apache Spark 3 ou mais recente
Sim
ClickHouse
Sim
Cloudera Impala 3.1 ou mais recente
Sim
Cloudera Impala 3.1+ com driver nativo
Sim
Cloudera Impala com driver nativo
Sim
DataVirtuality
Sim
Databricks
Sim
Denodo 7
Sim
Denodo 8
Sim
Dremio
Sim
Dremio 11 ou mais recente
Sim
Exasol
Sim
Firebolt
Sim
SQL legado do Google BigQuery
Sim
SQL padrão do Google BigQuery
Sim
PostgreSQL do Google Cloud
Sim
Google Cloud SQL
Sim
Google Spanner
Sim
Greenplum
Sim
HyperSQL
Sim
IBM Netezza
Sim
MariaDB
Sim
Microsoft Azure PostgreSQL
Sim
Banco de dados SQL do Microsoft Azure
Sim
Microsoft Azure Synapse Analytics
Sim
Microsoft SQL Server 2008 ou mais recente
Sim
Microsoft SQL Server 2012 ou mais recente
Sim
Microsoft SQL Server 2016
Sim
Microsoft SQL Server 2017 ou mais recente
Sim
MongoBI
Sim
MySQL
Sim
MySQL 8.0.12+
Sim
Oracle
Sim
Oracle ADWC
Sim
PostgreSQL 9.5 ou mais recente
Sim
PostgreSQL anterior à versão 9.5
Sim
PrestoDB
Sim
PrestoSQL
Sim
SAP HANA 2+
Sim
SingleStore
Sim
SingleStore 7+
Sim
Snowflake
Sim
Teradata
Sim
Trino
Sim
Vetor
Sim
Vertica
Sim

Tabelas derivadas persistentes

Uma tabela derivada persistente (PDT) é gravada em um esquema inicial no seu banco de dados e regenerada na programação especificada com uma estratégia de persistência.

Uma PDT pode ser uma tabela derivada nativa ou uma tabela derivada baseada em SQL.

Requisitos para PDTs

Para usar tabelas derivadas persistentes (TDPs) no seu projeto do Looker, você precisa do seguinte:

  • Um dialeto de banco de dados compatível com PDTs. Consulte a seção Dialetos de banco de dados compatíveis com PDTs mais adiante nesta página para conferir as listas de dialetos que oferecem suporte a tabelas derivadas persistentes com base em SQL e tabelas derivadas nativas persistentes.
  • Um esquema de scratch no seu banco de dados. Pode ser qualquer esquema no seu banco de dados, mas recomendamos criar um novo esquema que será usado apenas para essa finalidade. O administrador do banco de dados precisa configurar o esquema com permissão de gravação para o usuário do banco de dados do Looker.

  • Uma conexão do Looker com a opção Ativar TDPs ativada. Isso geralmente é configurado quando você configura a conexão do Looker pela primeira vez (consulte a página de documentação Dialetos do Looker para ver instruções sobre o dialeto do seu banco de dados), mas também é possível ativar os TDPs para a conexão após a configuração inicial.

Dialetos de banco de dados compatíveis com PDTs

Para que o Looker ofereça suporte a tabelas derivadas permanentes (PDTs, na sigla em inglês) no seu projeto, o dialeto do banco de dados também precisa oferecer suporte a elas.

Para oferecer suporte a qualquer tipo de PDT (com base no LookML ou no SQL), o dialeto precisa oferecer suporte a gravações no banco de dados, entre outros requisitos. Há algumas configurações de banco de dados somente leitura que não permitem que a persistência funcione (geralmente bancos de dados de réplica de troca a quente do Postgres). Nesses casos, use tabelas derivadas temporárias.

A tabela a seguir mostra os dialetos que oferecem suporte a tabelas derivadas com base em SQL persistentes na versão mais recente do Looker:

Dialeto Compatível?
Actian Avalanche
Sim
Amazon Athena
Sim
MySQL do Amazon Aurora
Sim
Amazon Redshift
Sim
Apache Druid
Não
Apache Druid 0.13 ou mais recente
Não
Apache Druid 0.18+
Não
Apache Hive 2.3 ou mais recente
Sim
Apache Hive 3.1.2 ou mais recente
Sim
Apache Spark 3 ou mais recente
Sim
ClickHouse
Não
Cloudera Impala 3.1 ou mais recente
Sim
Cloudera Impala 3.1+ com driver nativo
Sim
Cloudera Impala com driver nativo
Sim
DataVirtuality
Não
Databricks
Sim
Denodo 7
Não
Denodo 8
Não
Dremio
Não
Dremio 11 ou mais recente
Não
Exasol
Sim
Firebolt
Não
SQL legado do Google BigQuery
Sim
SQL padrão do Google BigQuery
Sim
PostgreSQL do Google Cloud
Sim
Google Cloud SQL
Sim
Google Spanner
Não
Greenplum
Sim
HyperSQL
Não
IBM Netezza
Sim
MariaDB
Sim
Microsoft Azure PostgreSQL
Sim
Banco de dados SQL do Microsoft Azure
Sim
Microsoft Azure Synapse Analytics
Sim
Microsoft SQL Server 2008 ou mais recente
Sim
Microsoft SQL Server 2012 ou mais recente
Sim
Microsoft SQL Server 2016
Sim
Microsoft SQL Server 2017 ou mais recente
Sim
MongoBI
Não
MySQL
Sim
MySQL 8.0.12+
Sim
Oracle
Sim
Oracle ADWC
Sim
PostgreSQL 9.5 ou mais recente
Sim
PostgreSQL anterior à versão 9.5
Sim
PrestoDB
Sim
PrestoSQL
Sim
SAP HANA 2+
Sim
SingleStore
Sim
SingleStore 7+
Sim
Snowflake
Sim
Teradata
Sim
Trino
Sim
Vetor
Sim
Vertica
Sim

Para oferecer suporte a tabelas derivadas nativas persistentes (com consultas baseadas em LookML), o dialeto também precisa oferecer suporte a uma função DDL CREATE TABLE. Esta é uma lista dos dialetos que oferecem suporte a tabelas derivadas nativas (com base no LookML) persistentes na versão mais recente do Looker:

Dialeto Compatível?
Actian Avalanche
Sim
Amazon Athena
Sim
MySQL do Amazon Aurora
Sim
Amazon Redshift
Sim
Apache Druid
Não
Apache Druid 0.13 ou mais recente
Não
Apache Druid 0.18+
Não
Apache Hive 2.3 ou mais recente
Sim
Apache Hive 3.1.2 ou mais recente
Sim
Apache Spark 3 ou mais recente
Sim
ClickHouse
Não
Cloudera Impala 3.1 ou mais recente
Sim
Cloudera Impala 3.1+ com driver nativo
Sim
Cloudera Impala com driver nativo
Sim
DataVirtuality
Não
Databricks
Sim
Denodo 7
Não
Denodo 8
Não
Dremio
Não
Dremio 11 ou mais recente
Não
Exasol
Sim
Firebolt
Não
SQL legado do Google BigQuery
Sim
SQL padrão do Google BigQuery
Sim
PostgreSQL do Google Cloud
Sim
Google Cloud SQL
Não
Google Spanner
Não
Greenplum
Sim
HyperSQL
Não
IBM Netezza
Sim
MariaDB
Sim
Microsoft Azure PostgreSQL
Sim
Banco de dados SQL do Microsoft Azure
Sim
Microsoft Azure Synapse Analytics
Sim
Microsoft SQL Server 2008 ou mais recente
Sim
Microsoft SQL Server 2012 ou mais recente
Sim
Microsoft SQL Server 2016
Sim
Microsoft SQL Server 2017 ou mais recente
Sim
MongoBI
Não
MySQL
Sim
MySQL 8.0.12+
Sim
Oracle
Sim
Oracle ADWC
Sim
PostgreSQL 9.5 ou mais recente
Sim
PostgreSQL anterior à versão 9.5
Sim
PrestoDB
Sim
PrestoSQL
Sim
SAP HANA 2+
Sim
SingleStore
Sim
SingleStore 7+
Sim
Snowflake
Sim
Teradata
Sim
Trino
Sim
Vetor
Sim
Vertica
Sim

Criar TDPs incrementais

Uma PDT incremental é uma tabela derivada persistente (PDT) que o Looker cria anexando dados novos à tabela em vez de recriar a tabela por completo.

Se o dialeto for compatível com PDTs incrementais e usar uma estratégia de persistência baseada em acionadores (datagroup_trigger, sql_trigger_value ou interval_trigger), você pode definir o PDT como incremental.

Consulte a página de documentação PDTs incrementais para mais informações.

Dialetos de banco de dados compatíveis com PDTs incrementais

Para que o Looker ofereça suporte a PDTs incrementais no projeto, seu dialeto de banco de dados também precisa oferecer suporte a elas. A tabela a seguir mostra quais dialetos oferecem suporte a PDTs incrementais na versão mais recente do Looker:

Dialeto Compatível?
Actian Avalanche
Não
Amazon Athena
Não
MySQL do Amazon Aurora
Não
Amazon Redshift
Sim
Apache Druid
Não
Apache Druid 0.13 ou mais recente
Não
Apache Druid 0.18+
Não
Apache Hive 2.3 ou mais recente
Não
Apache Hive 3.1.2 ou mais recente
Não
Apache Spark 3 ou mais recente
Não
ClickHouse
Não
Cloudera Impala 3.1 ou mais recente
Não
Cloudera Impala 3.1+ com driver nativo
Não
Cloudera Impala com driver nativo
Não
DataVirtuality
Não
Databricks
Sim
Denodo 7
Não
Denodo 8
Não
Dremio
Não
Dremio 11 ou mais recente
Não
Exasol
Não
Firebolt
Não
SQL legado do Google BigQuery
Não
SQL padrão do Google BigQuery
Sim
PostgreSQL do Google Cloud
Sim
Google Cloud SQL
Não
Google Spanner
Não
Greenplum
Sim
HyperSQL
Não
IBM Netezza
Não
MariaDB
Não
Microsoft Azure PostgreSQL
Sim
Banco de dados SQL do Microsoft Azure
Não
Microsoft Azure Synapse Analytics
Sim
Microsoft SQL Server 2008 ou mais recente
Não
Microsoft SQL Server 2012 ou mais recente
Não
Microsoft SQL Server 2016
Não
Microsoft SQL Server 2017 ou mais recente
Não
MongoBI
Não
MySQL
Sim
MySQL 8.0.12+
Sim
Oracle
Não
Oracle ADWC
Não
PostgreSQL 9.5 ou mais recente
Sim
PostgreSQL anterior à versão 9.5
Sim
PrestoDB
Não
PrestoSQL
Não
SAP HANA 2+
Não
SingleStore
Não
SingleStore 7+
Não
Snowflake
Sim
Teradata
Não
Trino
Não
Vetor
Não
Vertica
Sim

Como criar TDPs

Para transformar uma tabela derivada em uma tabela derivada persistente (PDT, na sigla em inglês), defina uma estratégia de persistência para ela. Para otimizar a performance, adicione uma estratégia de otimização.

Estratégias de persistência

A persistência de uma tabela derivada pode ser gerenciada pelo Looker ou, para dialetos compatíveis com visualizações materializadas, pelo seu banco de dados usando visualizações materializadas.

Para tornar uma tabela derivada persistente, adicione um dos seguintes parâmetros à definição de derived_table:

Com estratégias de persistência baseadas em acionadores (datagroup_trigger, sql_trigger_value e interval_trigger), o Looker mantém a PDT no banco de dados até que ela seja acionada para a reconstrução. Quando o PDT é acionado, o Looker o recria para substituir a versão anterior. Isso significa que, com as TDPs baseadas em acionadores, os usuários não precisam esperar a criação da TDP para receber respostas para as consultas do Explorar.

datagroup_trigger

Os grupos de dados são o método mais flexível de criação de persistência. Se você tiver definido um datagroup com sql_trigger ou interval_trigger, use o parâmetro datagroup_trigger para iniciar a recriação das tabelas derivadas persistentes (PDTs).

O Looker mantém a PDT no banco de dados até que o grupo de dados seja acionado. Quando o grupo de dados é acionado, o Looker recria o PDT para substituir a versão anterior. Isso significa que, na maioria dos casos, os usuários não precisam esperar a criação do PDT. Se um usuário solicitar dados do PDT enquanto ele está sendo criado e os resultados da consulta não estiverem no cache, o Looker vai retornar dados do PDT atual até que o novo PDT seja criado. Consulte Como armazenar consultas em cache para ter uma visão geral dos grupos de dados.

Consulte a seção O regenerador do Looker para mais informações sobre como o regenerador cria PDTs.

sql_trigger_value

O parâmetro sql_trigger_value aciona a nova geração de uma tabela derivada persistente (PDT) com base em uma instrução SQL fornecida por você. Se o resultado da instrução SQL for diferente do valor anterior, o PDT será regenerado. Caso contrário, o PDT atual será mantido no banco de dados. Isso significa que, na maioria dos casos, os usuários não precisam esperar a criação do PDT. Se um usuário solicitar dados do PDT enquanto ele está sendo criado e os resultados da consulta não estiverem no cache, o Looker vai retornar dados do PDT atual até que o novo PDT seja criado.

Consulte a seção O regenerador do Looker para mais informações sobre como o regenerador cria PDTs.

interval_trigger

O parâmetro interval_trigger aciona a nova geração de uma tabela derivada persistente (PDT) com base em um intervalo de tempo fornecido por você, como "24 hours" ou "60 minutes". Assim como o parâmetro sql_trigger, isso significa que o PDT geralmente será criado antes da consulta dos usuários. Se um usuário solicitar dados do PDT enquanto ele está sendo criado e os resultados da consulta não estiverem no cache, o Looker vai retornar dados do PDT atual até que o novo PDT seja criado.

persist_for

Outra opção é usar o parâmetro persist_for para definir o período de armazenamento da tabela derivada antes que ela seja marcada como expirada, para que não seja mais usada em consultas e seja excluída do banco de dados.

Uma tabela derivada permanente (PDT, na sigla em inglês) persist_for é criada quando um usuário executa uma consulta nela pela primeira vez. O Looker mantém o PDT no banco de dados pelo período especificado no parâmetro persist_for do PDT. Se um usuário consultar o PDT dentro do tempo persist_for, o Looker vai usar os resultados armazenados em cache, se possível, ou executar a consulta no PDT.

Após o período de persist_for, o Looker limpa o PDT do seu banco de dados, e ele será recriado na próxima consulta de um usuário, o que significa que a consulta terá que aguardar a recriação.

Os PDTs que usam persist_for não são recriados automaticamente pelo regenerador do Looker, exceto no caso de uma cascata de dependência de PDTs. Quando uma tabela persist_for faz parte de uma cascata de dependências com PDTs com base em acionadores (PDTs que usam a estratégia de persistência datagroup_trigger, interval_trigger ou sql_trigger_value), o regenerador monitora e recria a tabela persist_for para recriar outras tabelas na cascata. Consulte a seção Como o Looker cria tabelas derivadas em cascata nesta página.

materialized_view: yes

As visualizações materializadas permitem aproveitar a funcionalidade do banco de dados para manter tabelas derivadas no projeto do Looker. Se o dialeto do banco de dados oferecer suporte a visualizações materializadas e a conexão do Looker estiver configurada com a opção Ativar TDPs ativada, será possível criar uma visualização materializada especificando materialized_view: yes para uma tabela derivada. As visualizações materializadas são compatíveis com tabelas derivadas nativas e com base em SQL.

Semelhante a uma tabela derivada persistente (PDT, na sigla em inglês), uma visualização materializada é um resultado de consulta armazenado como uma tabela no esquema inicial do banco de dados. A principal diferença entre uma PDT e uma visualização materializada é a forma como as tabelas são atualizadas:

  • Para PDTs, a estratégia de persistência é definida no Looker e gerenciada por ele.
  • Para visualizações materializadas, o banco de dados é responsável por manter e atualizar os dados na tabela.

Por esse motivo, a funcionalidade de visualização materializada exige conhecimento avançado do seu dialeto e dos recursos dele. Na maioria dos casos, o banco de dados atualiza a visualização materializada sempre que detecta novos dados nas tabelas consultadas por ela. As visualizações materializadas são ideais para cenários que exigem dados em tempo real.

Consulte a página de documentação do parâmetro materialized_view (link em inglês) para informações sobre suporte a dialetos, requisitos e considerações importantes.

Estratégias de otimização

Como as tabelas derivadas persistentes (PDTs, na sigla em inglês) são armazenadas no banco de dados, é recomendável otimizar as PDTs usando as seguintes estratégias, conforme o suporte do seu dialeto:

Por exemplo, para adicionar persistência ao exemplo de tabela derivada, defina-o para ser recriado quando o grupo de dados orders_datagroup for acionado e adicione índices em customer_id e first_order, como este:

view: customer_order_summary {
  derived_table: {
    explore_source: orders {
      ...
    }
    datagroup_trigger: orders_datagroup
    indexes: ["customer_id", "first_order"]
  }
}

Se você não adicionar um índice (ou um equivalente para seu dialeto), o Looker vai avisar que você precisa fazer isso para melhorar a performance da consulta.

Casos de uso de PDTs

As tabelas derivadas persistentes (PDTs, na sigla em inglês) são úteis porque podem melhorar a performance de uma consulta ao manter os resultados da consulta em uma tabela.

Como prática recomendada geral, os desenvolvedores devem tentar modelar dados sem usar PDTs até que seja absolutamente necessário.

Em alguns casos, os dados podem ser otimizados de outras maneiras. Por exemplo, adicionar um índice ou alterar o tipo de dados de uma coluna pode resolver um problema sem a necessidade de criar um PDT. Analise os planos de execução de consultas lentas usando a ferramenta Explain from SQL Runner.

Além de reduzir o tempo de consulta e a carga do banco de dados em consultas executadas com frequência, há vários outros casos de uso para PDTs, incluindo:

Também é possível usar um PDT para definir uma chave primária nos casos em que não há uma maneira razoável de identificar uma linha exclusiva em uma tabela como uma chave primária.

Como usar PDTs para testar otimizações

É possível usar PDTs para testar diferentes indexações, distribuições e outras opções de otimização sem precisar de muito suporte dos desenvolvedores de DBA ou ETL.

Considere um caso em que você tem uma tabela, mas quer testar índices diferentes. O LookML inicial da visualização pode ser parecido com este:

view: customer {
  sql_table_name: warehouse.customer ;;
}

Para testar estratégias de otimização, use o parâmetro indexes para adicionar índices ao LookML desta forma:

view: customer {
  # sql_table_name: warehouse.customer
  derived_table: {
    sql: SELECT * FROM warehouse.customer ;;
    persist_for: "8 hours"
    indexes: [customer_id, customer_name, salesperson_id]
  }
}

Consulte a visualização uma vez para gerar o PDT. Em seguida, execute as consultas de teste e compare os resultados. Se os resultados forem favoráveis, peça para a equipe de DBA ou ETL adicionar os índices à tabela original.

Não se esqueça de mudar o código da visualização para remover o PDT.

Usar PDTs para pré-combinar ou agregar dados

Pode ser útil combinar ou agregar dados previamente para ajustar a otimização da consulta para volumes altos ou vários tipos de dados.

Por exemplo, suponha que você queira criar uma consulta para clientes por coorte com base no momento em que eles fizeram o primeiro pedido. Essa consulta pode ser cara para executar várias vezes sempre que os dados forem necessários em tempo real. No entanto, você pode calcular a consulta apenas uma vez e reutilizar os resultados com um PDT:

view: customer_order_facts {
  derived_table: {
    sql: SELECT
    c.customer_id,
    MIN(o.order_date) OVER (PARTITION BY c.customer_id) AS first_order_date,
    MAX(o.order_date) OVER (PARTITION BY c.customer_id) AS most_recent_order_date,
    COUNT(o.order_id) OVER (PARTITION BY c.customer_id) AS lifetime_orders,
    SUM(o.order_value) OVER (PARTITION BY c.customer_id) AS lifetime_value,
    RANK() OVER (PARTITION BY c.customer_id ORDER BY o.order_date ASC) AS order_sequence,
    o.order_id
    FROM warehouse.customer c LEFT JOIN warehouse.order o ON c.customer_id = o.customer_id
    ;;
    sql_trigger_value: SELECT CURRENT_DATE ;;
    indexes: [customer_id, order_id, order_sequence, first_order_date]
  }
}

Tabelas derivadas em cascata

É possível referenciar uma tabela derivada na definição de outra, criando uma cadeia de tabelas derivadas em cascata ou tabelas derivadas persistentes em cascata (PDTs, na sigla em inglês), conforme o caso. Um exemplo de tabelas derivadas em cascata seria uma tabela, TABLE_D, que depende de outra tabela, TABLE_C, enquanto TABLE_C depende de TABLE_B e TABLE_B depende de TABLE_A.

Sintaxe para fazer referência a uma tabela derivada

Para fazer referência a uma tabela derivada em outra, use esta sintaxe:

`${derived_table_or_view_name.SQL_TABLE_NAME}`

Nesse formato, SQL_TABLE_NAME é uma string literal. Por exemplo, você pode fazer referência à tabela derivada clean_events com esta sintaxe:

`${clean_events.SQL_TABLE_NAME}`

Você pode usar essa mesma sintaxe para se referir a uma visualização do LookML. Novamente, neste caso, SQL_TABLE_NAME é uma string literal.

No próximo exemplo, o PDT clean_events é criado a partir da tabela events no banco de dados. O PDT clean_events exclui linhas indesejadas da tabela de banco de dados events. Em seguida, um segundo PDT é mostrado. O PDT event_summary é um resumo do PDT clean_events. A tabela event_summary é regenerada sempre que novas linhas são adicionadas a clean_events.

As PDTs event_summary e clean_events são PDTs em cascata, em que event_summary depende de clean_events, já que event_summary é definido usando a PDT clean_events. Esse exemplo específico pode ser feito de maneira mais eficiente em um único PDT, mas é útil para demonstrar referências de tabelas derivadas.

view: clean_events {
  derived_table: {
    sql:
      SELECT *
      FROM events
      WHERE type NOT IN ('test', 'staff') ;;
    datagroup_trigger: events_datagroup
  }
}

view: events_summary {
  derived_table: {
    sql:
      SELECT
        type,
        date,
        COUNT(*) AS num_events
      FROM
        ${clean_events.SQL_TABLE_NAME} AS clean_events
      GROUP BY
        type,
        date ;;
    datagroup_trigger: events_datagroup
  }
}

Embora nem sempre seja necessário, quando você se refere a uma tabela derivada dessa maneira, é útil criar um alias para a tabela usando este formato:

${derived_table_or_view_name.SQL_TABLE_NAME} AS derived_table_or_view_name

O exemplo anterior faz o seguinte:

${clean_events.SQL_TABLE_NAME} AS clean_events

É útil usar um alias porque, nos bastidores, os PDTs são nomeados com códigos longos no banco de dados. Em alguns casos (especialmente com cláusulas ON), é fácil esquecer que é necessário usar a sintaxe ${derived_table_or_view_name.SQL_TABLE_NAME} para recuperar esse nome longo. Um alias pode ajudar a evitar esse tipo de erro.

Como o Looker cria tabelas derivadas em cascata

No caso de tabelas derivadas temporárias em cascata, se os resultados da consulta de um usuário não estiverem no cache, o Looker vai criar todas as tabelas derivadas necessárias para a consulta. Se você tiver um TABLE_D com uma definição que contenha uma referência a TABLE_C, TABLE_D depende de TABLE_C. Isso significa que, se você consultar TABLE_D e a consulta não estiver no cache do Looker, ele vai recriar TABLE_D. Mas primeiro, ele precisa recriar TABLE_C.

Agora, vamos considerar um cenário de tabelas derivadas temporárias em cascata em que TABLE_D depende de TABLE_C, que depende de TABLE_B, que depende de TABLE_A. Se o Looker não tiver resultados válidos para uma consulta em TABLE_C no cache, ele vai criar todas as tabelas necessárias para a consulta. Assim, o Looker vai criar TABLE_A, depois TABLE_B e, por fim, TABLE_C:

Nesse cenário, a TABLE_A precisa ser gerada antes que o Looker possa começar a gerar a TABLE_B, e assim por diante, até que a TABLE_C seja concluída e o Looker possa fornecer os resultados da consulta. Como TABLE_D não é necessário para responder a essa consulta, o Looker não vai recriar TABLE_D no momento.

Consulte a página de documentação do parâmetro datagroup para conferir um exemplo de cenário de PDTs em cascata que usam o mesmo grupo de dados.

A mesma lógica básica se aplica aos PDTs: o Looker cria qualquer tabela necessária para responder a uma consulta, até a cadeia de dependências. No entanto, com PDTs, geralmente as tabelas já existem e não precisam ser recriadas. Com consultas de usuário padrão em PDTs em cascata, o Looker recria os PDTs na cascata somente se não houver uma versão válida deles no banco de dados. Se você quiser forçar uma recriação para todos os PDTs em cascata, reconstrua manualmente as tabelas de uma consulta usando uma Análise.

Um ponto lógico importante a ser entendido é que, no caso de uma cascata de PDT, um PDT dependente está basicamente consultando o PDT de que depende. Isso é importante principalmente para PDTs que usam a estratégia persist_for. Normalmente, as PDTs persist_for são criadas quando um usuário as consulta, permanecem no banco de dados até que o intervalo de persist_for termine e não são recriadas até a próxima consulta por um usuário. No entanto, se um PDT persist_for fizer parte de uma cascata com PDTs com base em acionadores (PDTs que usam a estratégia de persistência datagroup_trigger, interval_trigger ou sql_trigger_value), o PDT persist_for será consultado sempre que os PDTs dependentes forem recriados. Nesse caso, a TDP persist_for será recriada de acordo com a programação das TDPs dependentes. Isso significa que as TDPs persist_for podem ser afetadas pela estratégia de persistência dos dependentes.

Como reconstruir manualmente tabelas persistentes para uma consulta

Os usuários podem selecionar a opção Recriar e executar tabelas derivadas no menu "Explore" para substituir as configurações de persistência e recriar todas as tabelas derivadas persistentes (TDPs) e agregadas necessárias para a consulta atual:

Clicar no botão "Abrir ações" abre o menu "Análise", em que você pode selecionar "Recriar tabelas derivadas e executar".

Essa opção só fica visível para usuários com permissão develop e somente após o carregamento da consulta da Análise.

A opção Recriar tabelas derivadas e executar recria todas as tabelas persistentes (todos os PDTs e tabelas agregadas) necessárias para responder à consulta, independentemente da estratégia de persistência. Isso inclui todas as tabelas e PDTs agregados na consulta atual e também todas as tabelas e PDTs agregados que são referenciadas pelas tabelas e PDTs agregados na consulta atual.

No caso de PDTs incrementais, a opção Rebuild Derived Tables & Run (Recriar tabelas derivadas e executar) aciona a criação de um novo incremento. Com PDTs incrementais, um incremento inclui o período especificado no parâmetro increment_key e também o número de períodos anteriores especificados no parâmetro increment_offset, se houver. Consulte a página de documentação PDTs incrementais para conferir alguns exemplos de cenários que mostram como os PDTs incrementais são criados, dependendo da configuração.

No caso de PDTs em cascata, isso significa recriar todas as tabelas derivadas na cascata, começando pela parte de cima. Esse é o mesmo comportamento de quando você consulta uma tabela em uma cascata de tabelas derivadas temporárias:

Se a tabela_c depender da tabela_b e a tabela_b depender da tabela_a, a reconstrução da tabela_c vai primeiro reconstruir a tabela_a, depois a tabela_b e, por fim, a tabela_c.

Observe o seguinte sobre a reconstrução manual de tabelas derivadas:

  • Para o usuário que inicia a operação Recriar tabelas derivadas e executar, a consulta vai aguardar a reconstrução das tabelas antes de carregar os resultados. As consultas de outros usuários ainda vão usar as tabelas atuais. Depois que as tabelas persistentes forem recriadas, todos os usuários vão usar as tabelas recriadas. Embora esse processo seja projetado para evitar a interrupção das consultas de outros usuários enquanto as tabelas são recriadas, esses usuários ainda podem ser afetados pela carga adicional no banco de dados. Se você estiver em uma situação em que acionar uma recriação durante o horário comercial possa causar uma tensão inaceitável no banco de dados, talvez seja necessário comunicar aos usuários que eles nunca devem recriar determinados PDTs ou tabelas de agregação durante esse horário.
  • Se um usuário estiver no Modo de desenvolvimento e a Análise detalhada for baseada em uma tabela de desenvolvimento, a operação Recriar e executar tabelas derivadas vai recriar a tabela de desenvolvimento, não a de produção, para a Análise detalhada. No entanto, se a versão do modo de desenvolvimento do recurso "Explore" estiver usando a versão de produção de uma tabela derivada, a tabela de produção será recriada. Consulte Tabelas persistidas no modo de desenvolvimento para informações sobre tabelas de desenvolvimento e de produção.

  • Nas instâncias hospedadas pelo Looker, se a tabela derivada demorar mais de uma hora para ser recriada, a tabela não será recriada e a sessão do navegador será encerrada. Consulte a seção Tempos limite e enfileiramento de consultas na página de documentação Configurações do administrador: consultas para mais informações sobre os tempos limite que podem afetar os processos do Looker.

Tabelas persistidas no modo de desenvolvimento

O Looker tem alguns comportamentos especiais para gerenciar tabelas persistentes no modo de desenvolvimento.

Se você consultar uma tabela persistente no modo de desenvolvimento sem fazer mudanças na definição dela, o Looker vai consultar a versão de produção dessa tabela. Se você mudar a definição da tabela de modo que afete os dados ou a forma como ela é consultada, uma nova versão de desenvolvimento será criada na próxima consulta da tabela no modo de desenvolvimento. Com essa tabela de desenvolvimento, você pode testar mudanças sem incomodar os usuários finais.

O que faz com que o Looker crie uma tabela de desenvolvimento

Sempre que possível, o Looker usa a tabela de produção atual para responder às consultas, mesmo que você não esteja no modo de desenvolvimento. No entanto, há casos em que o Looker não pode usar a tabela de produção para consultas no modo de desenvolvimento:

O Looker vai criar uma tabela de desenvolvimento se você estiver no modo de desenvolvimento e consultar uma tabela derivada baseada em SQL definida usando uma cláusula WHERE condicional com instruções if prod e if dev.

Para tabelas persistentes que não têm um parâmetro para restringir o conjunto de dados no modo de desenvolvimento, o Looker usa a versão de produção da tabela para responder às consultas no modo de desenvolvimento, a menos que você mude a definição da tabela e consulte a tabela no modo de desenvolvimento. Isso vale para qualquer mudança na tabela que afete os dados ou a forma como ela é consultada.

Confira alguns exemplos de tipos de mudanças que vão fazer com que o Looker crie uma versão de desenvolvimento de uma tabela persistente. O Looker só vai criar a tabela se você consultar a tabela depois de fazer essas mudanças:

Para mudanças que não modificam os dados da tabela ou afetam a forma como o Looker consulta a tabela, ele não cria uma tabela de desenvolvimento. O parâmetro publish_as_db_view é um bom exemplo: no modo de desenvolvimento, se você mudar apenas a configuração publish_as_db_view de uma tabela derivada, o Looker não precisará recriar a tabela derivada, portanto, não criará uma tabela de desenvolvimento.

Por quanto tempo o Looker mantém as tabelas de desenvolvimento

Independentemente da estratégia de persistência real da tabela, o Looker trata as tabelas persistidas de desenvolvimento como se tivessem uma estratégia de persistência de persist_for: "24 hours". O Looker faz isso para garantir que as tabelas de desenvolvimento não sejam mantidas por mais de um dia, já que um desenvolvedor do Looker pode consultar muitas iterações de uma tabela durante o desenvolvimento e sempre que uma nova tabela de desenvolvimento é criada. Para evitar que as tabelas de desenvolvimento entupam o banco de dados, o Looker aplica a estratégia persist_for: "24 hours" para garantir que as tabelas sejam limpas do banco de dados com frequência.

Caso contrário, o Looker cria tabelas derivadas persistentes (PDTs) e tabelas agregadas no modo de desenvolvimento da mesma forma que cria tabelas persistidas no modo de produção.

Se uma tabela de desenvolvimento for mantida no banco de dados quando você implantar mudanças em uma PDT ou tabela agregada, o Looker poderá usar a tabela de desenvolvimento como a tabela de produção para que os usuários não precisem esperar a criação da tabela ao consultar.

Ao implantar as mudanças, talvez seja necessário recriar a tabela para que ela seja consultada na produção, dependendo da situação:

  • Se já se passaram mais de 24 horas desde que você fez a consulta da tabela no modo de desenvolvimento, a versão de desenvolvimento da tabela será marcada como expirada e não será usada para consultas. É possível verificar se há PDTs não criados usando o ambiente de desenvolvimento do Looker ou a guia Desenvolvimento da página Tabelas derivadas persistentes. Se você tiver PDTs não criados, poderá consultar esses dados no modo de desenvolvimento antes de fazer as mudanças para que a tabela de desenvolvimento esteja disponível para uso na produção.
  • Se uma tabela persistida tiver o parâmetro dev_filters (para tabelas derivadas nativas) ou a cláusula WHERE condicional que usa as instruções if prod e if dev (para tabelas derivadas baseadas em SQL), a tabela de desenvolvimento não poderá ser usada como a versão de produção, já que ela tem um conjunto de dados abreviado. Nesse caso, depois de terminar de desenvolver a tabela e antes de implantar as mudanças, você pode comentar o parâmetro dev_filters ou a cláusula condicional WHERE e consultar a tabela no modo de desenvolvimento. O Looker vai criar uma versão completa da tabela que pode ser usada para produção quando você implantar as mudanças.

Caso contrário, se você implantar as mudanças quando não houver uma tabela de desenvolvimento válida que possa ser usada como a tabela de produção, o Looker vai recriar a tabela na próxima vez que ela for consultada no modo de produção (para tabelas persistentes que usam a estratégia persist_for) ou na próxima execução do regenerador (para tabelas persistentes que usam datagroup_trigger, interval_trigger ou sql_trigger_value).

Como verificar TDPs não criadas no Modo de Desenvolvimento

Se uma tabela de desenvolvimento for mantida no banco de dados quando você implantar mudanças em uma tabela derivada persistente (PDT, na sigla em inglês) ou uma tabela agregada, o Looker poderá usar a tabela de desenvolvimento como a tabela de produção para que os usuários não precisem esperar pela criação da tabela ao consultar. Consulte as seções Por quanto tempo o Looker persiste nas tabelas de desenvolvimento e O que faz com que o Looker crie uma tabela de desenvolvimento nesta página para mais detalhes.

Portanto, é ideal que todos os PDTs sejam criados quando você implantar na produção para que as tabelas possam ser usadas imediatamente como as versões de produção.

Você pode verificar se há PDTs não criados no seu projeto no painel Saúde do projeto. Clique no ícone Project Health no ambiente de desenvolvimento integrado do Looker para abrir o painel Project Health. Em seguida, clique no botão Validar status da TDP.

Se houver TDPs não criadas, o painel Saúde do projeto vai listá-las:

O painel "Project Health" mostra uma lista de TDPs não criados para o projeto e um botão "Go to PDT Management".

Se você tiver permissão see_pdts, clique no botão Acessar o gerenciamento de TDPs. O Looker vai abrir a guia Development da página Persistent Derived Tables e filtrar os resultados para seu projeto específico do LookML. Lá, você pode conferir quais PDTs de desenvolvimento foram criados e desfeitos e acessar outras informações de solução de problemas. Consulte a página de documentação Configurações de administrador: tabelas derivadas persistentes para mais informações.

Depois de identificar um TDP não criado no projeto, você pode criar uma versão de desenvolvimento abrindo uma Análise que consulta a tabela e usando a opção Recriar e executar tabelas derivadas no menu "Análise". Consulte a seção Recriar manualmente tabelas persistentes para uma consulta nesta página.

Compartilhamento e limpeza de tabelas

Em qualquer instância do Looker, ele vai compartilhar tabelas persistidas entre usuários se elas tiverem a mesma definição e a mesma configuração de método de persistência. Além disso, se a definição de uma tabela deixar de existir, o Looker vai marcar a tabela como expirada.

Isso traz vários benefícios:

  • Se você não fez nenhuma mudança em uma tabela no Modo de desenvolvimento, suas consultas vão usar as tabelas de produção atuais. Isso acontece a menos que a tabela seja uma tabela derivada baseada em SQL definida usando uma cláusula WHERE condicional com instruções if prod e if dev. Se a tabela for definida com uma cláusula WHERE condicional, o Looker vai criar uma tabela de desenvolvimento se você consultar a tabela no modo de desenvolvimento. Para tabelas derivadas nativas com o parâmetro dev_filters, o Looker tem a lógica de usar a tabela de produção para responder a consultas no modo de desenvolvimento, a menos que você mude a definição da tabela e consulte a tabela no modo de desenvolvimento.
  • Se dois desenvolvedores fizerem a mesma alteração em uma tabela no modo de desenvolvimento, eles vão compartilhar a mesma tabela de desenvolvimento.
  • Depois que você envia as mudanças do modo de desenvolvimento para o modo de produção, a definição de produção antiga deixa de existir. Portanto, a tabela de produção antiga é marcada como expirada e excluída.
  • Se você decidir descartar as mudanças do Modo de desenvolvimento, essa definição de tabela não vai mais existir. Portanto, as tabelas de desenvolvimento desnecessárias serão marcadas como expiradas e descartadas.

Como trabalhar mais rápido no Modo de desenvolvimento

Há situações em que a tabela derivada persistente (PDT, na sigla em inglês) que você está criando leva muito tempo para ser gerada, o que pode ser demorado se você estiver testando muitas mudanças no Modo de desenvolvimento. Nesses casos, é possível solicitar que o Looker crie versões menores de uma tabela derivada quando você estiver no modo de desenvolvimento.

Para tabelas derivadas nativas, use o subatributo dev_filters de explore_source para especificar filtros que são aplicados apenas a versões de desenvolvimento da tabela derivada:

view: e_faa_pdt {
  derived_table: {
  ...
    datagroup_trigger: e_faa_shared_datagroup
    explore_source: flights {
      dev_filters: [flights.event_date: "90 days"]
      filters: [flights.event_date: "2 years", flights.airport_name: "Yucca Valley Airport"]
      column: id {}
      column: airport_name {}
      column: event_date {}
    }
  }
...
}

Este exemplo inclui um parâmetro dev_filters que filtra os dados dos últimos 90 dias e um parâmetro filters que filtra os dados dos últimos dois anos e do aeroporto Yucca Valley.

O parâmetro dev_filters atua em conjunto com o parâmetro filters para que todos os filtros sejam aplicados à versão de desenvolvimento da tabela. Se dev_filters e filters especificarem filtros para a mesma coluna, dev_filters terá precedência para a versão de desenvolvimento da tabela. Neste exemplo, a versão de desenvolvimento da tabela vai filtrar os dados dos últimos 90 dias do aeroporto de Yucca Valley.

Para tabelas derivadas baseadas em SQL, o Looker oferece suporte a uma cláusula WHERE condicional com diferentes opções para versões de produção (if prod) e de desenvolvimento (if dev) da tabela:

view: my_view {
  derived_table: {
    sql:
      SELECT
        columns
      FROM
        my_table
      WHERE
        -- if prod -- date > '2000-01-01'
        -- if dev -- date > '2020-01-01'
      ;;
  }
}

Neste exemplo, a consulta vai incluir todos os dados de 2000 em diante no modo de produção, mas apenas os dados de 2020 em diante no modo de desenvolvimento. Usar esse recurso de forma estratégica para limitar seu conjunto de resultados e aumentar a velocidade da consulta pode facilitar muito a validação de mudanças no modo de desenvolvimento.

Como o Looker cria TDPs

Depois que uma tabela derivada persistente (PDT, na sigla em inglês) é definida e executada pela primeira vez ou acionada pelo regenerador para ser recriada de acordo com a estratégia de persistência, o Looker segue estas etapas:

  1. Use o SQL da tabela derivada para criar e executar uma instrução CREATE TABLE AS SELECT (ou CTAS). Por exemplo, para recriar um PDT chamado customer_orders_facts: CREATE TABLE tmp.customer_orders_facts AS SELECT ... FROM ... WHERE ...
  2. Emitir as instruções para criar os índices quando a tabela for criada
  3. Renomeie a tabela de LC$.. ("Criar leitor") para LR$.. ("Ler leitor"), para indicar que a tabela está pronta para uso
  4. Exclua qualquer versão mais antiga da tabela que não esteja mais em uso

Há algumas implicações importantes:

  • O SQL que forma a tabela derivada precisa ser válido em uma instrução CTAS.
  • Os aliases de coluna no conjunto de resultados da instrução SELECT precisam ser nomes de coluna válidos.
  • Os nomes usados ao especificar distribuição, chaves de classificação e índices precisam ser os nomes das colunas listados na definição SQL da tabela derivada, não os nomes dos campos definidos no LookML.

O regenerador do Looker

O regenerador do Looker verifica o status e inicia a recriação de tabelas persistidas por gatilho. Uma tabela com gatilho permanente é uma tabela derivada persistente (TDP) ou uma tabela agregada que usa um gatilho como estratégia de persistência:

  • Para tabelas que usam sql_trigger_value, o acionador é uma consulta especificada no parâmetro sql_trigger_value da tabela. O regenerador do Looker aciona uma recriação da tabela quando o resultado da verificação da consulta de gatilho mais recente é diferente do resultado da verificação da consulta de gatilho anterior. Por exemplo, se a tabela derivada for mantida com a consulta SQL SELECT CURDATE(), o regenerador do Looker vai recriar a tabela na próxima vez que o regenerador verificar o acionador após a data mudar.
  • Para tabelas que usam interval_trigger, o acionador é um período especificado no parâmetro interval_trigger da tabela. O regenerador do Looker aciona uma recriação da tabela quando o tempo especificado passa.
  • Para tabelas que usam datagroup_trigger, o acionador pode ser uma consulta especificada no parâmetro sql_trigger do grupo de dados associado ou um período especificado no parâmetro interval_trigger do grupo de dados.

O regenerador do Looker também inicia reconstruções de tabelas persistidas que usam o parâmetro persist_for, mas somente quando a tabela persist_for é uma dependência em cascata de uma tabela persistida por gatilho. Nesse caso, o gerador de Looker vai iniciar as reconexões de uma tabela persist_for, já que ela é necessária para recriar as outras tabelas na cascata. Caso contrário, o regenerador não monitora tabelas persistidas que usam a estratégia persist_for.

O ciclo do regenerador do Looker começa em um intervalo regular configurado pelo administrador do Looker na configuração Datagroup and PDT Maintenance Schedule na conexão do banco de dados (o padrão é um intervalo de cinco minutos). No entanto, o gerador de Looker não inicia um novo ciclo até concluir todas as verificações e reconstruções de PDT do último ciclo. Isso significa que, se você tiver builds de PDT de longa duração, o ciclo de regeneração do Looker poderá não ser executado com a frequência definida na configuração Programação de manutenção de grupos de dados e PDT. Outros fatores podem afetar o tempo necessário para recriar as tabelas, conforme descrito na seção Considerações importantes para implementar tabelas persistentes desta página.

Nos casos em que uma TDP não é criada, o regenerador pode tentar recriar a tabela no próximo ciclo de regeneração:

  • Se a configuração Repetir builds de TDP com falha estiver ativada na conexão do banco de dados, o regenerador do Looker tentará recriar a tabela durante o próximo ciclo do regenerador, mesmo que a condição de acionamento da tabela não seja atendida.
  • Se a configuração Repetir builds de TDP com falha estiver desativada, o regenerador do Looker não tentará recriar a tabela até que a condição de acionamento da TDP seja atendida.

Se um usuário solicitar dados da tabela persistente enquanto ela está sendo criada e os resultados da consulta não estiverem no cache, o Looker vai verificar se a tabela ainda é válida. A tabela anterior pode não ser válida se não for compatível com a nova versão, o que pode acontecer se a nova tabela tiver uma definição diferente, usar uma conexão de banco de dados diferente ou tiver sido criada com uma versão diferente do Looker. Se a tabela atual ainda for válida, o Looker vai retornar dados dela até que a nova seja criada. Caso contrário, se a tabela atual não for válida, o Looker vai fornecer os resultados da consulta assim que a nova tabela for recriada.

Considerações importantes para implementar tabelas persistentes

Considerando a utilidade das tabelas persistidas (PDTs e tabelas agregadas), é fácil acumular muitas delas na sua instância do Looker. É possível criar um cenário em que o regenerador do Looker precisa criar muitas tabelas ao mesmo tempo. Principalmente com tabelas em cascata ou de execução longa, é possível criar um cenário em que as tabelas têm um longo atraso antes da recriação ou em que os usuários enfrentam um atraso na obtenção dos resultados da consulta de uma tabela enquanto o banco de dados está trabalhando para gerar a tabela.

O regenerador do Looker verifica se é necessário recriar as tabelas persistidas por gatilho. O ciclo do regenerador é definido em um intervalo regular configurado pelo administrador do Looker na configuração Programação de manutenção de grupo de dados e de TDP na conexão do banco de dados (o padrão é um intervalo de cinco minutos).

Vários fatores podem afetar o tempo necessário para recriar as tabelas:

  • O administrador do Looker pode ter alterado o intervalo das verificações do gatilho do regenerador usando a configuração Datagroup and PDT Maintenance Schedule na conexão do banco de dados.
  • O gerador de Looker não inicia um novo ciclo até concluir todas as verificações e reconstruções de PDT do último ciclo. Portanto, se você tiver builds de PDT de longa duração, o ciclo de regeneração do Looker pode não ser tão frequente quanto a configuração Programação de manutenção de grupo de dados e PDT.
  • Por padrão, o regenerador pode iniciar a reconstrução de uma TDP ou tabela de agregação por vez em uma conexão. Um administrador do Looker pode ajustar o número permitido de reconstruções simultâneas do regenerador usando o campo Número máximo de conexões do builder da PDT nas configurações de uma conexão.
  • Todas as PDTs e tabelas agregadas acionadas pelo mesmo datagroup serão recriadas durante o mesmo processo de regeneração. Isso pode ser uma carga pesada se você tiver muitas tabelas usando o grupo de dados, diretamente ou como resultado de dependências em cascata.

Além das considerações anteriores, há algumas situações em que você precisa evitar adicionar persistência a uma tabela derivada:

  • Quando as tabelas derivadas forem expandidas, cada extensão de um PDT vai criar uma nova cópia da tabela no seu banco de dados.
  • Quando as tabelas derivadas usam filtros de modelo ou parâmetros líquidos: a persistência não é compatível com tabelas derivadas que usam filtros de modelo ou parâmetros líquidos.
  • Quando as tabelas derivadas nativas são criadas com base em análises detalhadas que usam atributos do usuário com access_filters ou com sql_always_where, cópias da tabela são criadas no seu banco de dados para cada valor possível de atributo do usuário especificado.
  • Quando os dados subjacentes mudam com frequência e o dialeto do banco de dados não oferece suporte a PDTs incrementais.
  • Quando o custo e o tempo envolvidos na criação de PDTs são muito altos.

Dependendo do número e da complexidade das tabelas persistidas na conexão do Looker, a fila pode conter muitas tabelas persistidas que precisam ser verificadas e recriadas em cada ciclo. Portanto, é importante considerar esses fatores ao implementar tabelas derivadas na sua instância do Looker.

Como gerenciar TDPs em grande escala pela API

Monitorar e gerenciar tabelas derivadas persistentes (PDTs, na sigla em inglês) que são atualizadas em horários diferentes fica cada vez mais complexo à medida que você cria mais PDTs na sua instância. Use a integração do Apache Airflow do Looker para gerenciar as programações de TDP com outros processos de ETL e ELT.

Monitoramento e solução de problemas de PDTs

Se você usa tabelas derivadas persistentes (PDTs, na sigla em inglês) e, principalmente, PDTs cascatas, é útil conferir o status delas. Você pode usar a página de administrador Tabelas derivadas permanentes do Looker para conferir o status das PDTs. Consulte a página de documentação Configurações de administrador: tabelas derivadas persistentes para mais informações.

Ao tentar resolver problemas de PDTs:

  • Preste atenção especial à distinção entre tabelas de desenvolvimento e de produção ao investigar o registro de eventos do PDT.
  • Verifique se não foram feitas mudanças no esquema inicial em que o Looker armazena tabelas derivadas persistentes. Se houver mudanças, talvez seja necessário atualizar as configurações de Conexão na seção Administrador do Looker e, possivelmente, reiniciar o Looker para restaurar a funcionalidade normal do PDT.
  • Determine se há problemas com todas as TDPs ou apenas com uma. Se houver um problema com um deles, provavelmente é causado por um erro do LookML ou do SQL.
  • Determine se os problemas com a TDP correspondem aos horários em que ela está programada para ser recriada.
  • Verifique se todas as consultas sql_trigger_value são avaliadas com sucesso e retornam apenas uma linha e uma coluna. Para PDTs baseadas em SQL, execute-as no SQL Runner. A aplicação de um LIMIT protege contra consultas incontroláveis. Para mais informações sobre como usar o SQL Runner para depurar tabelas derivadas, consulte a postagem da comunidade Como usar o SQL Runner para testar tabelas derivadas .
  • Para PDTs baseados em SQL, use o SQL Runner para verificar se o SQL da PDT é executado sem erros. Use um LIMIT no SQL Runner para manter os tempos de consulta razoáveis.
  • Para tabelas derivadas baseadas em SQL, evite usar expressões de tabela comuns (CTEs). O uso de CTEs com DTs cria instruções WITH aninhadas que podem fazer com que os PDTs falhem sem aviso. Em vez disso, use o SQL para a CTE para criar uma DT secundária e fazer referência a essa DT do primeiro DT usando a sintaxe ${derived_table_or_view_name.SQL_TABLE_NAME}.
  • Verifique se as tabelas em que a TDP do problema depende, sejam elas normais ou TDPs, existem e podem ser consultadas.
  • Verifique se as tabelas em que o PDT do problema depende não têm bloqueios compartilhados ou exclusivos. Para que o Looker crie um PDT, ele precisa adquirir uma trava exclusiva na tabela a ser atualizada. Isso vai entrar em conflito com outras fechaduras compartilhadas ou exclusivas que estão na tabela. O Looker não poderá atualizar o PDT até que todas as outras fechaduras sejam limpas. O mesmo vale para qualquer bloqueio exclusivo na tabela em que o Looker está criando um PDT. Se houver um bloqueio exclusivo em uma tabela, o Looker não poderá adquirir um bloqueio compartilhado para executar consultas até que o bloqueio exclusivo seja limpo.
  • Use o botão Show Processes no SQL Runner. Se houver um grande número de processos ativos, isso poderá atrasar os tempos de consulta.
  • Monitore os comentários na consulta. Consulte a seção Consultar comentários sobre PDTs nesta página.

Consultar comentários de TDPs

Os administradores de banco de dados podem diferenciar facilmente consultas normais daquelas que geram tabelas derivadas persistentes (PDTs, na sigla em inglês). O Looker adiciona comentários à instrução CREATE TABLE ... AS SELECT ... que inclui o modelo e a visualização do LookML do PDT, além de um identificador exclusivo (slug) para a instância do Looker. Se o PDT estiver sendo gerado em nome de um usuário no modo de desenvolvimento, os comentários vão indicar o ID do usuário. Os comentários de geração de PDT seguem este padrão:

-- Building `<view_name>` in dev mode for user `<user_id>` on instance `<instance_slug>`
CREATE TABLE `<table_name>` SELECT ...
-- finished `<view_name>` => `<table_name>`

O comentário de geração de PDT vai aparecer na guia SQL de uma análise se o Looker tiver que gerar um PDT para a consulta da análise. O comentário vai aparecer na parte de cima da instrução SQL.

Por fim, o comentário de geração de PDT aparece no campo Mensagem na guia Informações do detalhes da consulta pop-up para cada consulta na página de administração Consultas.

Como recriar TDPs após uma falha

Quando uma tabela derivada persistente (PDT) falha, isto acontece quando ela é consultada:

  • O Looker vai usar os resultados no cache se a mesma consulta tiver sido executada anteriormente. Consulte a página de documentação Armazenamento em cache de consultas para uma explicação de como isso funciona.
  • Se os resultados não estiverem no cache, o Looker vai extrair os resultados do PDT no banco de dados, se houver uma versão válida do PDT.
  • Se não houver um PDT válido no banco de dados, o Looker tentará recriar o PDT.
  • Se a TDP não puder ser recriada, o Looker vai retornar um erro para uma consulta. O regenerador do Looker vai tentar recriar o TDP na próxima vez que ele for consultado ou quando a estratégia de persistência do TDP acionar uma recriação.

Com as PDTs em cascata, a mesma lógica se aplica, exceto que, com as PDTs em cascata:

  • A falha na criação de uma tabela impede a criação das TDPs na cadeia de dependência.
  • Uma TDP dependente basicamente consulta a TDP em que ela se baseia. Portanto, a estratégia de persistência de uma tabela pode acionar a recriação das TDPs subordinadas.

Voltando ao exemplo anterior de tabelas em cascata, em que TABLE_D depende de TABLE_C, que depende de TABLE_B, que depende de TABLE_A:

Se TABLE_B tiver uma falha, todo o comportamento padrão (não em cascata) será aplicado a TABLE_B: se TABLE_B for consultado, o Looker primeiro tentará usar o cache para retornar resultados, depois tentará usar uma versão anterior da tabela, se possível, depois tentará recriar a tabela e, por fim, vai retornar um erro se TABLE_B não puder ser recriado. O Looker vai tentar reconstruir TABLE_B novamente quando a tabela for consultada ou quando a estratégia de persistência da tabela acionar uma reconstrução.

O mesmo vale para os dependentes de TABLE_B. Portanto, se TABLE_B não puder ser criado e houver uma consulta em TABLE_C:

  • O Looker vai tentar usar o cache da consulta em TABLE_C.
  • Se os resultados não estiverem no cache, o Looker vai tentar extrair os resultados de TABLE_C no banco de dados.
  • Se não houver uma versão válida de TABLE_C, o Looker vai tentar recriar TABLE_C, o que cria uma consulta em TABLE_B.
  • O Looker vai tentar recriar TABLE_B, o que vai falhar se TABLE_B não tiver sido corrigido.
  • Se TABLE_B não puder ser recriado, TABLE_C também não poderá ser recriado. Portanto, o Looker vai retornar um erro para a consulta em TABLE_C.
  • O Looker vai tentar recriar TABLE_C de acordo com a estratégia de persistência usual ou na próxima vez que o PDT for consultado, o que inclui a próxima vez que TABLE_D tentar criar, já que TABLE_D depende de TABLE_C.

Depois de resolver o problema com TABLE_B, TABLE_B e cada uma das tabelas dependentes vão tentar ser recriadas de acordo com as estratégias de persistência ou na próxima vez que forem consultadas, o que inclui a próxima vez que um PDT dependente tentar recriar. Ou, se uma versão de desenvolvimento das TDPs na cascata foi criada no modo de desenvolvimento, as versões de desenvolvimento podem ser usadas como as novas TDPs de produção. Consulte a seção Tabelas persistidas no modo de desenvolvimento nesta página para saber como isso funciona. Outra opção é usar uma análise detalhada para executar uma consulta em TABLE_D e reconstruir manualmente os PDTs para a consulta, o que forçará uma recriação de todos os PDTs que vão para a cascata de dependência.

Como melhorar a performance do PDT

Quando você cria tabelas derivadas persistentes (TDPs), o desempenho pode ser um problema. Consultar a tabela pode ser lento, especialmente quando ela é muito grande, assim como qualquer tabela grande no seu banco de dados.

É possível melhorar a performance filtrando os dados ou controlando como os dados no PDT são classificados e indexados.

Como adicionar filtros para limitar o conjunto de dados

Em conjuntos de dados particularmente grandes, ter muitas linhas vai atrasar as consultas em uma tabela derivada persistente (PDT). Se você geralmente consulta apenas dados recentes, adicione um filtro à cláusula WHERE do PDT que limite a tabela a 90 dias ou menos de dados. Dessa forma, apenas dados relevantes serão adicionados à tabela sempre que ela for recriada, para que a execução de consultas seja muito mais rápida. Em seguida, crie um PDT maior e separado para a análise histórica, permitindo consultas rápidas de dados recentes e a capacidade de consultar dados antigos.

Como usar indexes ou sortkeys e distribution

Ao criar uma grande tabela derivada persistente (PDT, na sigla em inglês), indexar a tabela (para dialetos como MySQL ou Postgres) ou adicionar chaves de classificação e distribuição (para Redshift) pode ajudar na performance.

Geralmente, é melhor adicionar o parâmetro indexes em campos de ID ou data.

No Redshift, geralmente é melhor adicionar o parâmetro sortkeys em campos de ID ou data e o parâmetro distribution no campo usado para a mesclagem.

As configurações a seguir controlam como os dados na tabela derivada persistente (PDT, na sigla em inglês) são classificados e indexados. Estas configurações são opcionais, mas altamente recomendadas:

  • Para o Redshift e o Aster, use o parâmetro distribution para especificar o nome da coluna cujo valor é usado para distribuir os dados em um cluster. Quando duas tabelas são mescladas pela coluna especificada no parâmetro distribution, o banco de dados pode encontrar os dados de mesclagem no mesmo nó, de modo que a E/S entre nós é minimizada.
  • No Redshift, defina o parâmetro distribution_style como all para instruir o banco de dados a manter uma cópia completa dos dados em cada nó. Isso é usado com frequência para minimizar a E/S entre nós quando tabelas relativamente pequenas são agrupadas. Defina esse valor como even para instruir o banco de dados a distribuir os dados uniformemente pelo cluster sem usar uma coluna de distribuição. Esse valor só pode ser especificado quando distribution não é especificado.
  • Para o Redshift, use o parâmetro sortkeys. Os valores especificam quais colunas do PDT são usadas para classificar os dados no disco e facilitar a pesquisa. No Redshift, você pode usar sortkeys ou indexes, mas não ambos.
  • Na maioria dos bancos de dados, use o parâmetro indexes. Os valores especificam quais colunas do PDT são indexadas. No Redshift, os índices são usados para gerar chaves de classificação intercaladas.