Otimização de consultas usando restrições de chave primária

Primário key restrições, que capturam relacionamentos entre campos em tabelas, podem ajudar os usuários e as ferramentas a entender os relacionamentos nos dados. Este artigo contém exemplos que mostram como o senhor pode usar a chave primária com a opção RELY para otimizar alguns tipos comuns de consultas.

Adicionar restrições de chave primária

O senhor pode adicionar uma restrição primária key na instrução de criação da tabela, como no exemplo a seguir, ou adicionar uma restrição a uma tabela usando a cláusula ADD CONSTRAINT.

CREATE TABLE customer (
  c_customer_sk int,
  PRIMARY KEY (c_customer_sk)
  ...
  )

Neste exemplo, c_customer_sk é o ID do cliente key. A restrição primária key especifica que cada valor de ID de cliente deve ser exclusivo na tabela. Databricks não impõe as restrições do site key. Eles podem ser validados por meio de seu pipeline de dados ou ETL existente. Consulte gerenciar a qualidade dos dados com Delta Live Tables para saber mais sobre as expectativas de trabalho em tabelas de transmissão e visualizações materializadas. Consulte Restrições em Databricks para saber mais sobre como trabalhar com restrições em tabelas Delta.

Observação

É responsabilidade do usuário verificar se uma restrição está satisfeita. Confiar em uma restrição que não está satisfeita pode levar a resultados de consulta incorretos.

Use RELY para ativar as otimizações

Quando o senhor sabe que uma restrição key primária é válida, pode ativar as otimizações com base na restrição especificando-a com a opção RELY. Consulte a cláusula ADD CONSTRAINT para obter a sintaxe completa.

A opção RELY permite que o Databricks explore a restrição para reescrever as consultas. As otimizações a seguir só podem ser executadas se a opção RELY for especificada em uma cláusula ADD CONSTRAINT ou instrução ALTER TABLE.

Usando ALTER TABLE, o senhor pode modificar o key primário de uma tabela para incluir a opção RELY, conforme mostrado no exemplo a seguir.

ALTER TABLE
  customer DROP PRIMARY KEY;
ALTER TABLE
  customer
ADD
  PRIMARY KEY (c_customer_sk) RELY;

Exemplos de otimização

Os exemplos a seguir estendem o exemplo anterior que cria uma tabela customer em que c_customer_sk é um identificador exclusivo verificado nomeado como PRIMARY KEY com a opção RELY especificada.

Exemplo 1: Eliminar agregações desnecessárias

A seguir, é mostrada uma consulta que aplica DISTINCT operações a um primário key.

SELECT
  DISTINCT c_customer_sk
FROM
  customer;

Como a coluna c_customer_sk é uma restrição PRIMARY KEY verificada, todos os valores da coluna são exclusivos. Se a opção RELY for especificada, o site Databricks poderá otimizar a consulta não executando as operações DISTINCT.

Exemplo 2: Eliminar junções desnecessárias

O exemplo a seguir mostra uma consulta em que Databricks pode eliminar um join desnecessário.

A consulta une uma tabela de fatos, store_sales, com uma tabela de dimensões, customer. Ele executa um left outer join, de modo que o resultado da consulta inclui todos os registros da tabela store_sales e os registros correspondentes da tabela customer. Se não houver nenhum registro correspondente na tabela customer, o resultado da consulta mostrará um valor NULL para a coluna c_customer_sk.

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss
  LEFT JOIN customer c ON ss.customer_sk = c.c_customer_sk;

Para entender por que esse join é desnecessário, considere a declaração de consulta. Ele requer apenas a coluna ss_quantity da tabela store_sales. A tabela customer é unida em sua tabela primária key, de modo que cada linha de store_sales corresponde a, no máximo, uma linha em customer. Como a operação é um outer join, todos os registros da tabela store_sales são preservados, portanto, o join não altera nenhum dado dessa tabela. A agregação SUM é a mesma, independentemente de essas tabelas estarem unidas ou não.

O uso da restrição key primária com RELY fornece ao otimizador de consultas as informações necessárias para eliminar o join. A consulta otimizada é mais ou menos assim:

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss

Próximos passos

Consulte view the Entity Relationship Diagram para saber como explorar os relacionamentos primários key e externos key na UI do Catalog Explorer.