Partilhar via


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

As restrições de chave primária, que capturam relações entre campos em tabelas, podem ajudar os usuários e as ferramentas a entender as relações em seus dados. Este 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.

Observação

As otimizações de consulta associadas ao RELY comando exigem que as consultas sejam executadas na computação habilitada para Photon. Veja O que é Photon?. O Photon é executado por padrão em armazéns SQL e computação sem servidor para blocos de anotações e fluxos de trabalho. Para saber mais sobre Photon, consulte O que é 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)
  ...
  )

Neste 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 de chave. Eles podem ser validados por meio de seu pipeline de dados existente ou ETL. Consulte Gerencie a qualidade dos dados com as expectativas do pipeline para saber mais sobre as expectativas de trabalho em tabelas de streaming e visualizações materializadas. Consulte Restrições no Azure Databricks para saber mais sobre como trabalhar com restrições em tabelas Delta.

Observação

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

Use RELY para habilitar otimizações

Quando você souber que uma restrição de chave primária é válida, poderá 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ó podem ser executadas se a RELY opção for especificada em uma ADD CONSTRAINT cláusula ou ALTER TABLE instrução.

Usando ALTER TABLE, 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 onde c_customer_sk é um identificador exclusivo verificado nomeado como um PRIMARY KEY com a opção RELY especificada.

Exemplo 1: Eliminar agregações desnecessárias

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

SELECT
  DISTINCT c_customer_sk
FROM
  customer;

Como a coluna c_customer_sk é uma restrição de 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 executando a operação de DISTINCT.

Exemplo 2: Eliminar junções desnecessárias

O exemplo a seguir mostra uma consulta em que o Azure Databricks pode eliminar uma associação desnecessária.

A consulta une uma tabela de fatos, store_sales com uma tabela de dimensão, customer. Ele executa uma junção externa esquerda, portanto, 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 de 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 esta junção é desnecessária, considere a declaração de consulta. Requer apenas a coluna ss_quantity da tabela store_sales. A tabela customer é ligada na sua chave primária, de modo que cada linha de store_sales corresponde a, no máximo, uma linha em 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, quer estas tabelas sejam ou não unidas.

O uso da restrição de chave primária com o RELY fornece ao otimizador de consulta as informações necessárias para eliminar a associação. A consulta otimizada tem mais esta aparência:

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss

Próximos passos

Consulte Exibir o Diagrama de Relacionamento de Entidade para saber como explorar relações de chave primária e chave estrangeira na interface do usuário do Gerenciador de Catálogo.