¿La clave de partición también tiene que ser parte de la clave primaria?

24

¿Estoy particionando una tabla basada en una columna que no es una clave principal? Hoy leí información contradictoria sobre si la columna de partición debe ser parte de la clave primaria. Mi instinto dice que no, pero no estoy 100% seguro. Entonces preguntas ...

  1. ¿Debe la columna de partición ser parte del primario? ¿Se recomienda de una forma u otra?
  2. ¿Tengo que crear un índice para la clave de partición o el DBMS lo hace automáticamente por sí solo?
AngryHacker
fuente

Respuestas:

11

De ningún modo.

Uno de los escenarios más comunes para la partición es usar un campo de fecha, que no tiene ninguna relación con su PK.

Por ejemplo, si tiene una tabla Orderscon el campo OrderDate, lo más probable es que particione según el mes y el año de OrderDate.

Cuando los registros caducan y ya no son relevantes, puede mover esas particiones a una tabla de archivo o base de datos para que ya no se procesen.

La partición funcionará con casi cualquier campo, pero para que funcione BIEN, los campos en los que particiones deben usarse en la mayoría de tus consultas, si no en todas. Si no incluye sus claves de partición, obtendrá esencialmente un escaneo de tablas costoso que atraviesa varias tablas (particiones).

EDITAR

Para la parte 2, creo que la respuesta es no también. La clave de partición se usa para determinar en qué partición colocar la fila, pero no creo que se mantenga un índice. Sin embargo, puede haber estadísticas en el back end.

JNK
fuente
10
Sé que esto es viejo, pero me llevó por un camino equivocado, así que pensé en comentar para los demás. La columna de partición debe estar en la clave principal si desea utilizar las habilidades de INTERRUPTOR de la función de partición. Si no está en la clave principal, obtendrá este error: Partition columns for a unique index must be a subset of the index key.
Vaccano
Estoy de acuerdo con @Vaccano
san
3

Además de la respuesta de JNK, probablemente debería leer este artículo que trata sobre la alineación de particiones de tabla y particiones de índice.

Hay muchos tipos de escenarios en los que el esquema de particionamiento sigue exactamente la primera columna de la clave primaria, por ejemplo, en un escenario de depósito de datos donde la fecha de la instantánea de una tabla de hechos suele ser la columna de partición, así como la primera columna de la clave primaria.

Pero igualmente, en entornos OLTP donde la PK es una IDENTIDAD u otra clave sustituta, tiene poco sentido usar esto para la partición, ya que la partición en números arbitrarios normalmente no es terriblemente útil. En los sistemas OLTP, también tiende a dividir más por fecha (probablemente no en el PK), pero potencialmente también regionalmente o por algún tipo de división organizacional (tal vez en el PK si no está utilizando un sustituto).

Pero no es un requisito.

Cade Roux
fuente
Bueno, muchas cosas no son un requisito. ¡Incluso la indexación no es un requisito! Para tener sentido funcionalmente, la partición debe hacerse en la columna inicial de una clave candidata. De lo contrario, ¿cómo utilizaría la tabla el arquitecto de la aplicación?
srini.venigalla
@ srini.venigalla Ese es un caso común, pero otro caso común (¿igualmente?) es particionar algo que no es parte de una clave primaria o candidata, ya que la partición a menudo se usa para archivar, una fecha de vencimiento puede ser Una buena opción de partición. Pero no hay nada que implique que podría ser parte de una clave. Particionar es una característica de bajo nivel que es bastante genérica y aquí hay al menos dos patrones de uso distintos y conflictivos, los cuales tienen mejores prácticas legítimas a su alrededor.
Cade Roux
0

Tiene que ser parte de una clave candidata, si no parte de la clave primaria en sí. La idea es que su partición debe alinearse con la clave principal.

Entonces la respuesta es sí, se prefiere ser parte de la PK. Si no es otra clave, que es lo suficientemente buena como para ser una PK.

srini.venigalla
fuente
Nunca he oído hablar de la clave del candidato. ¿Cómo se especifica en la declaración de la tabla Crear / Alterar?
AngryHacker
La clave de candidato es solo otra clave calificada para ser una clave principal. Por ejemplo, ID es la clave principal. Pero en la misma tabla, si hay otra columna por ej. PERSON_ID también puede identificar de forma exclusiva una fila, que se llama Candidate Key. Las reglas de normalización segunda y tercera también deben ser válidas para todas las claves candidatas.
srini.venigalla
Entendido. ¿Qué pasa con la segunda parte de mi pregunta?
AngryHacker
Igual que cualquier otro índice. ejemplo: CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (BusinessEntityID);
srini.venigalla
44
Esto es absolutamente incorrecto. Puede particionar en muchos campos que no están relacionados con la PK, como por ejemplo OrderDate. ¿Tienes algo para respaldar tus reclamos?
JNK