Optimización de consultas mediante clave primaria y restricciones únicas

Las restricciones de clave principal y únicas, que capturan relaciones de unicidad entre campos de tablas, pueden ayudar a los usuarios y herramientas a comprender las relaciones de los datos. Este artículo contiene ejemplos que muestran cómo puede usar claves principales o restricciones únicas con la RELY opción de optimizar algunos tipos comunes de consultas.

Nota

Las optimizaciones de consultas asociadas al comando RELY requieren que las consultas se ejecuten en un cómputo con Photon habilitado. Consulte ¿Qué es Photon? Photon se ejecuta de forma predeterminada en almacenes SQL y en informática sin servidor para cuadernos y procesos de trabajo. Para obtener más información sobre Photon, consulte ¿Qué es Photon?.

Agregar clave primaria o restricciones de unicidad

Puede agregar una clave principal o una restricción única en la instrucción de creación de tablas, como en el ejemplo siguiente, o agregar una a una tabla mediante la ADD CONSTRAINT cláusula .

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

En este ejemplo, c_customer_sk es la clave de identificador de cliente. La restricción de clave principal especifica que cada valor de identificador de cliente debe ser único en la tabla. Las restricciones únicas siguen el mismo patrón mediante UNIQUE en lugar de PRIMARY KEY.

Azure Databricks no aplica restricciones de clave. Se pueden validar mediante la canalización de datos existente o ETL. Consulte Administrar la calidad de los datos con expectativas de canalización para obtener información sobre cómo trabajar con expectativas en tablas de streaming y vistas materializadas. Consulte Restricciones en Azure Databricks para obtener información sobre cómo trabajar con restricciones en tablas Delta.

Nota

Es responsabilidad del usuario comprobar si se cumple una restricción. Confiar en una restricción que no se cumple puede dar lugar a resultados de consulta incorrectos.

Uso de RELY para habilitar optimizaciones

Cuando sepa que una clave principal o una restricción única son válidas, puede habilitar las optimizaciones basadas en la restricción especificando con la RELY opción . Consulte ADD CONSTRAINT cláusula para obtener la sintaxis completa.

La opción RELY permite a Azure Databricks aprovechar la restricción para volver a escribir consultas. Las siguientes optimizaciones solo pueden realizarse si la opción RELY se especifica en una cláusula ADD CONSTRAINT o en una instrucción ALTER TABLE.

Con ALTER TABLE, puede modificar la clave principal de una tabla para incluir la RELY opción , como se muestra en el ejemplo siguiente.


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

Ejemplos de optimización

Los siguientes ejemplos amplían el ejemplo anterior que crea una tabla customer donde c_customer_sk es un identificador único verificado denominado como PRIMARY KEY con la opción RELY especificada. Las mismas optimizaciones se pueden aplicar a una UNIQUE restricción con la RELY opción .

Ejemplo 1: Eliminación de agregaciones innecesarias

A continuación se muestra una consulta que aplica una operación DISTINCT a una clave principal.

SELECT
  DISTINCT c_customer_sk
FROM
  customer;

Dado que la columna c_customer_sk es una restricción PRIMARY KEY verificada, todos los valores de la columna son únicos. Si se especifica la opción RELY, Azure Databricks puede optimizar la consulta al no realizar la operación DISTINCT.

El optimizador también puede quitar DISTINCT cuando la columna seleccionada está cubierta por una restricción válida UNIQUE especificada con RELY.

Ejemplo 2: Eliminación de combinaciones innecesarias

En el ejemplo siguiente se muestra una consulta en la que Azure Databricks puede eliminar una combinación innecesaria.

La consulta combina una tabla de hechos, store_sales, con una tabla de dimensiones, customer. Realiza una combinación externa izquierda, por lo que el resultado de la consulta incluye todos los registros de la tabla store_sales y los registros coincidentes de la tabla customer. Si no hay ningún registro coincidente en la tabla customer, el resultado de la consulta muestra un valor NULL para la columna 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 qué esta combinación es innecesaria, considere la instrucción de consulta. Solo requiere la columna ss_quantity de la tabla store_sales. La tabla customer se une mediante su clave primaria o una restricción de unicidad, por lo que cada fila de store_sales se corresponde como máximo con una fila de customer. Como la operación es una combinación externa, se conservan todos los registros de la tabla store_sales, por lo que la combinación no cambia ningún dato de esa tabla. La agregación SUM es la misma tanto si estas tablas están unidas como si no.

El uso de la clave principal o la restricción única con RELY proporciona al optimizador de consultas la información que necesita para eliminar la combinación. La consulta optimizada tiene un aspecto más similar al siguiente:

SELECT
  SUM(ss_quantity)
FROM
  store_sales ss

Pasos siguientes

Consulte Vista del diagrama de relación de entidades para aprender a explorar las relaciones de clave principal y clave externa en la interfaz de usuario del Explorador de catálogos.