Pular para o conteúdo principal

Otimização de consultas usando restrições primárias key

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 primárias key

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.

SQL
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 pipeline expectations 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.

nota

É 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 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 realizadas 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.

SQL

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 chamado PRIMARY KEY com a opção RELY especificada.

Exemplo 1: Elimine agregações desnecessárias

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

SQL
SELECT
DISTINCT c_customer_sk
FROM
customer;

Como a coluna c_customer_sk é uma restrição PRIMARY KEY verificada, todos os valores na 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.

SQL
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. Ela requer somente 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 serem 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 se parece mais com isso:

SQL
SELECT
SUM(ss_quantity)
FROM
store_sales ss

Próximas etapas

Consulte Visualizar o Diagrama de Relacionamento entre Entidades para saber como explorar os relacionamentos primários key e externos key na interface do usuário do Catalog Explorer.