Compartilhar via


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

As restrições de chave primária, que capturam relacionamentos entre campos em tabelas, podem ajudar os usuários e as ferramentas a compreender os relacionamentos em seus dados. Esse artigo contém exemplos que mostram como você pode usar chaves primárias com a opção RELY para otimizar alguns tipos comuns de consultas.

Nota

As otimizações de consulta associadas ao RELY comando exigem que as consultas sejam executadas na computação habilitada para Photon. Confira O que é o Photon?. O Photon é executado por padrão em depósitos SQL e em computação sem servidor para notebooks e fluxos de trabalho. Para saber mais sobre o Photon, confira O que é o Photon?.

Adicionar restrições de chave primária

Você pode adicionar uma restrição de chave primária em sua instrução de criação de 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)
  ...
  )

Nesse exemplo, c_customer_sk é a chave de ID do cliente. A restrição de chave primária especifica que cada valor de ID do cliente deve ser exclusivo na tabela. O Azure Databricks não impõe restrições importantes. Eles podem ser validados por meio de seu pipeline de dados existente ou ETL. Confira Gerenciar a qualidade dos dados com expectativas de pipeline para saber mais sobre as expectativas de uso em tabelas de streaming e exibições materializadas. Veja Restrições no Azure 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. Depender de uma restrição que não está satisfeita pode levar a resultados de consulta incorretos.

Use RELY para habilitar otimizações

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

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

Usando ALTER TABLE, você pode modificar a chave primária 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 denominado PRIMARY KEY com a opção RELY especificada.

Exemplo 1: Elimine agregações desnecessárias

Veja a seguir uma consulta que aplica uma operação DISTINCT a uma chave primária.

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. Com a opção RELY especificada, o Azure Databricks pode otimizar a consulta não realizando a operação DISTINCT.

Exemplo 2: Elimine junções desnecessárias

O exemplo a seguir mostra uma consulta onde o Azure Databricks pode eliminar uma junção desnecessária.

A consulta une uma tabela de fatos store_sales com uma tabela de dimensões, customer. Ele executa uma junção externa esquerda, de modo que o resultado da consulta inclui todos os registros da tabela store_sales e registros correspondentes da tabela customer. Se não houver 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 essa junção é desnecessária, considere a instrução de consulta. Requer apenas a ss_quantity coluna da tabela store_sales. A tabela customer é unida em sua chave primária, então cada linha de store_sales corresponde no máximo a uma linha na customer. Como a operação é uma junção externa, todos os registros da tabela store_sales são preservados, portanto a junção não altera nenhum dado dessa tabela. A agregação SUM é a mesma, independentemente de essas tabelas estarem unidas ou não.

Usar a restrição de chave primária com RELY fornece ao otimizador de consulta as informações necessárias para eliminar a junção. A consulta otimizada se parece mais com isso:

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss

Próximas etapas

Veja Visualize o Diagrama de Relacionamento de Entidades para saber como explorar relacionamentos de chave primária e chave estrangeira na UI do Catalog Explorer.