Particionamiento de SQL Server: ¿qué usar para la clave de partición?

10

Nunca he trabajado con el particionamiento de SQL Server, pero actualmente me enfrento al diseño de una base de datos para la cual los volúmenes probablemente lo justifiquen. El sistema es para cupones. Los cupones se emitirán periódicamente, generalmente cada seis semanas, aunque también se emitirán ad-hoc, por ejemplo, para un evento especial. Hay 15 millones de clientes y por cada evento de emisión, cada cliente recibirá 6 tipos de cupones diferentes, lo que da un total de 90 millones de instancias de cupones. Necesitamos rastrear los datos de canje de instancias de cupones y mantenerlos durante 6 meses, aunque generalmente un cupón solo es válido por seis semanas. Cualquier solicitud de canje de un cupón no válido no llegará a la base de datos porque será validada por el TPV hasta.

Durante un período de seis meses, tendremos que almacenar hasta 360 millones de filas en la tabla de Instancias de cupones y hasta 72 millones (suponiendo una tasa de canje máxima del 20%) en la tabla de Canje. Tengo la sensación de que estos números son demasiado grandes para una sola partición?

Mi pregunta es: ¿qué usar como clave de partición? Un candidato obvio sería por evento de emisión, dando aproximadamente 6 particiones. ¿Pero entonces creo que tal vez incluso eso daría un tamaño de partición que es demasiado grande para permitir un rendimiento óptimo? ¿Sería posible particionar por dos claves, por ejemplo, por evento de emisión + último dígito del ID del cliente? Entonces la lógica sería:

If issuance event = 1 and last digit of customer id < 5 then
    Store in partition 1
Else if issuance event = 1 and last digit of customer id >4 then
    Store in partition 2
Else if issuance event =2 and last digit of customer id <5 then
    Store in partition 3
Else if issuance event =2 and last digit of customer id >4 then
    Store in partition 4
Etc...

Además, no estoy seguro de la especificación del servidor de base de datos que necesitaremos. ¿Serán suficientes 16gb y 8CPU? El db necesita poder devolver un resultado de la tabla de instancias de cupones, tecleado en un valor de código de barras numérico en menos de medio segundo. Se espera que la solicitud de transacción esperada para validar (seleccionar) y canjear (insertar) alcance un máximo de aproximadamente 3.500 por minuto.

El servidor SQL Server 2008r2 64bit db se aprovisionará como VM desde un host muy potente con acceso a un SAN de alto rendimiento y gran capacidad.

Estaría muy agradecido por cualquier consejo de aquellos que han implementado una solución de SQL Server para administrar volúmenes similares.

Saludos

Robar.

Rob Bowman
fuente
2
Sus tablas siguen siendo pequeñas, no NECESITO particiones, tengo una tabla con un par de miles de millones de filas sin particiones, funciona. Sin embargo, las particiones son buenas para FAST DROP.
TomTom
1
Tonterías @TomTom, las particiones pueden ser beneficiosas en los recuentos de filas una fracción de esto. Por supuesto, el esquema de partición tiene que ser beneficioso para los patrones de acceso para obtener una ganancia de rendimiento, pero un "no NECESIDAD" general en este tamaño es simplemente incorrecto.
Mark Storey-Smith
1
No, es correcto. NECESIDAD! = Beneficio. NECESIDAD es cuando tienes problemas para hacer consultas sin particiones.
TomTom
1
Hola @TomTom, creo que necesitas un pequeño compañero de descanso, eso es un poco fuerte, incluso si no es realmente ofensivo. Estoy de acuerdo con Mark StoreySmith, una manta "sin NECESIDAD" es simplemente incorrecta, sin embargo, su afirmación de que probablemente no sea necesaria es correcta. Me imagino que es una cuestión de indexación. También sé que Mark sabe a qué te refieres con necesidad versus beneficio. Déjenos un poco flojos y dejemos de tomar cafeína, k? (Y créeme, estoy sabe que tienen muy poca paciencia algunos días, especialmente los días como el de hoy en las que estoy en medicamentos para el dolor de espalda)
jcolebrand

Respuestas:

14

Las preguntas sobre las especificaciones del servidor deben dirigirse a Serverfault o DBA.SE.

Para la pregunta de particionamiento, no creo que necesite necesariamente particionar para esto.

Las filas de 360 ​​m son muchas, pero no demasiado difíciles de manejar.

No NO bajo ninguna circunstancia trate de partición basado en el último dígito de un campo. No estoy seguro de que esto funcione, pero no es SARGable, lo que no sería sostenible.

Si solo necesita hacer una búsqueda de una sola fila basada en una clave numérica, la partición probablemente no ayudará.

Si decide seguir la ruta de la partición, tenga en cuenta que, para ser efectivas, todas sus consultas deben incluir su (s) clave (s) de partición para que el motor sepa qué partición debe verificar. De lo contrario, los verificará a todos y realmente perjudicará el rendimiento.

JNK
fuente
También estoy de acuerdo. A veces solo necesitas mejores índices.
jcolebrand
No estoy de acuerdo @JNK. Una búsqueda de una sola fila basada en una clave numérica que se beneficia de la eliminación de la partición es la reducción de IO. Si los patrones de acceso son tales que las particiones a las que se accede con frecuencia permanecen en el grupo de búferes sobre las particiones a las que se accede con poca frecuencia, tiene más beneficios de rendimiento. Y ni siquiera hemos tocado mi característica favorita que le ofrece la partición, disponibilidad parcial.
Mark Storey-Smith
Para el registro, en sus otros puntos, estoy totalmente de acuerdo :)
Mark Storey-Smith
@ MarkStorey-Smith: dependerá de su clave. Como se define actualmente en el OP, la partición no agregaría ningún valor. También parece que no podrá usar una clave de dos partes con un campo de fecha o un esquema de partición "normal".
JNK
5

PUEDE particionar en varias claves si utiliza una columna calculada persistente; como han dicho otros, sin embargo, la partición no funciona para todas las situaciones. No estoy seguro de entender su escenario lo suficiente como para darle consejos específicos, pero aquí hay algunas pautas generales:

  • La partición es útil para leer datos cuando la clave de partición es parte de la instrucción SQL, lo que permite al optimizador invocar la exclusión de partición. Debe asegurarse de que la clave que elija sea útil para la mayoría de las consultas.

  • Una ventaja de una buena estrategia de particionamiento es el envejecimiento de los datos; por ejemplo, si su clave de partición está basada en la fecha (es decir, el día del año), y desea eliminar todos los datos que son más antiguos que una fecha determinada, es muy fácil CAMBIAR esas particiones a una tabla vacía y truncarlas.

Stuart Ainsworth
fuente
4

Realmente necesita definir sus requisitos un poco más claramente. Menciona que tendrá aproximadamente 360 ​​millones de filas en 6 meses. ¿Qué tal en 2 años? ¿Seguirá creciendo solo al ritmo que está creciendo actualmente? O existe la posibilidad de que experimente un crecimiento exponencial. ¿Desea mantener los datos en esta tabla para siempre? o desea archivar datos de forma regular.

El particionamiento se puede usar para archivar datos. Ver escenario de ventana deslizante. Vea este documento técnico y este .

El particionamiento también se puede usar para administrar la fragmentación del índice. Puede reconstruir / reorganizar particiones particulares.

También debe considerar las vistas particionadas en lugar de las tablas particionadas. Las vistas particionadas no requieren una licencia de SQL Server Enterprise. Las vistas particionadas también le permiten realizar reconstrucciones de índices en línea en una "partición" particular.

La partición también se puede considerar al hacer la planificación de recuperación ante desastres. Se puede usar para la recuperación parcial de la base de datos. Por ejemplo: puede tener sus particiones antiguas en un grupo de archivos diferente al de las particiones principales / actuales. Y luego, cuando se está recuperando, recupera el grupo de archivos primario, luego el grupo de archivos en el que residen sus particiones actuales y, por último, puede restaurar los grupos de archivos en los que residen las particiones antiguas. Esto puede reducir la cantidad de tiempo que su aplicación tiene que estar inactiva.

Mira este gran video de Kimberly Tripp sobre particiones .

Dharmendar Kumar 'DK'
fuente
Solo necesitamos conservar los datos durante seis meses. Cada semana, realizaríamos un trabajo de limpieza que eliminaría cualquier cupón emitido más de seis meses antes.
Rob Bowman
3
Entonces, básicamente, tendría que eliminar / eliminar aproximadamente 15 millones de filas cada semana. ¿Qué ancho tiene la mesa? Te sugiero que particiones la tabla por columna de fecha. De esta forma, las eliminaciones semanales serían una simple meta operación. Simplemente tiene que CAMBIAR la partición más antigua fuera de la tabla particionada principal en una tabla provisional. Luego suelte la mesa de ensayo. Esto se llama escenario de Windows deslizante. Busque el primer libro blanco que publiqué, oh, cómo hacer esto.
Dharmendar Kumar 'DK'
-2

A menos que realice particiones debido al archivo de datos antiguos, lo está haciendo por la razón incorrecta y no debe hacerlo.

Ryk
fuente
2
Hay muchas razones para usar la partición además del archivado; la exclusión de particiones es de gran beneficio para muchos tipos diferentes de consultas, si se usa correctamente.
Stuart Ainsworth
Estoy de acuerdo con Stuart, este es un mal consejo.
jcolebrand