Contactos

Creación de un modelo de base de datos física: diseño de producto. Creación de un modelo físico de una base de datos: Diseño de partición de SQL Server

Buenas noches / día / por la mañana, ¡querido Hermaloudi! Seguimos desarrollando y complementamos el blog sobre mi código abierto favorito RDBMS PostgreSQL. Fue milagrosamente, así que resultó que el tema del tema de hoy nunca se ha planteado aquí. Debo decir que la partición en PostgreSQL está muy bien descrita en la documentación, pero ¿me detendrá?).

Introducción

En general, bajo partición, en general, no entienden una tecnología, sino que se acercan al diseño de la base de datos, que parecía mucho tiempo antes de que los DBMS comenzaran a mantener los llamados. Tablas particionadas. El pensamiento es muy simple, divide la mesa en varias partes de un tamaño más pequeño. Hay dos subespecies: partición horizontal y vertical.
Partición horizontal
Las partes de la tabla contienen diferentes líneas. Nos ponemos una tabla de los troncos de una determinada aplicación abstracta - registros. Podemos romperlo en partes, una para registros en enero de 2009, la otra, para febrero de 2009, etc.
División vertical
Las partes de la tabla contienen diferentes columnas. Encuentre la solicitud de partición vertical (cuando esté realmente justificada) algo más complicada que para horizontal. Como un caballo esférico, propongo considerar esta opción: la tabla de noticias tiene la identificación, texto corto, texto largo y deje que el campo de texto largo se use mucho menos que los dos primeros. En este caso, tiene sentido romper la tabla de noticias en las columnas (cree dos tablas para Shorttext y LongText, respectivamente, las teclas primarias relacionadas + Cree Ver las noticias que contienen ambas columnas). Por lo tanto, cuando solo necesitamos una descripción de las noticias, el DBMS no tiene que leer desde el disco también toda la noticia de texto.
Partition de soporte en DBMS modernos.
La mayoría de los DBMS modernos admiten la partición de las tablas de una forma u otra.
  • Oráculo - Admite la partición comenzando con 8 versión. Trabajar con secciones por un lado es muy simple (en general, no puede pensar en ellos, trabaja con una tabla regular *), y por el otro, todo es muy flexible. Las secciones se pueden romper a las "subparticiones", eliminar, dividir, transferir. Se admiten diferentes opciones para la indexación de la tabla particionada (índice particionado índice global). Referencia a una descripción voluminosa.
  • Microsoft SQL Server - El apoyo único apareció recientemente (en 2005). La primera impresión de usar - "Bueno, finalmente !! :)", el segundo - "Funciona, todo parece estar bien". Documentación en MSDN.
  • Mysql - Soportes a partir de la versión 5.1. Muy buena descripción en Habé
  • Etc ...
* -Tra, por supuesto, hay un conjunto estándar de dificultades: para crear una nueva sección a tiempo, vieja para tirar, etc., pero de alguna manera todo es simple y comprensible.

Partición en postgresql

La partición de las tablas en PostgreSQL es algo diferente en las ventas de otras bases de datos. La base para la partición es la herencia de las tablas (la cosa inherente exclusivamente PostgreSQL). Es decir, debemos tener una mesa principal (tabla maestra), y sus secciones serán las mesas herederas. Consideraremos la partición en el ejemplo de una tarea aproximada a la realidad.
Formulación del problema
La base de datos se utiliza para recopilar y analizar datos en los visitantes del sitio / sitio. Los volúmenes de datos son lo suficientemente grandes para pensar en la partición. Al analizar, en la mayoría de los casos, los datos se utilizan para el último día.
1. Crea una tabla básica:
Crea la tabla analítica. Eventos.

User_id uuid no nulo,
event_type_id de pequeño no nulo,
Event_time TimeStamp predeterminado ahora () No nulo,
URL VARCHAR (1024) NO NULL,
Referencia VARCHAR (1024),
Inet inet no nulo
);

2. Vamos a particionar por día por el campo Event_time. Por cada día crearemos una nueva sección. Llamaremos a las secciones de acuerdo con la regla: analytics.events_ddmmyyyy. Por ejemplo, una sección para el 1 de enero de 2010.
Crea la tabla analítica.events_01012010.
Event_id bigint predeterminado nextval ("analytics.seq_events") clave primaria,
Check (event_time\u003e \u003d timestamp "2010-01-01 00:00:00" y event_time< TIMESTAMP "2010-01-02 00:00:00" )
) Hereda (Analytics.Events);

* Este código fuente se resaltó con el resaltador del código fuente.


Al crear una sección, especificamos explícitamente el campo Event_ID (la clave principal no se hereda) y creamos una restricción de cheque en el campo Event_Time, para no insertar demasiado.

3. Cree un índice en el campo Event_time. Al dividir la tabla en la sección, queremos decir que la mayoría de las solicitudes a la tabla de eventos utilizarán la condición en el campo Event_Time, para que el índice en este campo nos ayude mucho.

Crear índice eventos_01012010_event_time_idx on analytics.events_01012010 usando btree (event_time);

* Este código fuente se resaltó con el resaltador del código fuente.


4. Queremos asegurarnos de insertarlo en la tabla principal, los datos resultaron ser la sección destinada para ellos. Para hacer esto, hacemos el siguiente fint: cree un disparador que administrará los flujos de datos.
Crea o reemplaza la función analytics.events_insert_trigger ()
Devuelve el gatillo como $$
Empezar.
Si (nuevo .event_time\u003e \u003d timestamp "2010-01-01 00:00:00" y
Nuevo .Event_time.< TIMESTAMP "2010-01-02 00:00:00" ) THEN
Insertar en los valores analíticos.events_01012010 (Nuevo. *);
DEMÁS.
Elevar la excepción "Fecha de% está fuera de rango. Fijar analytics.events_insert_trigger", Nuevo .event_time;
TERMINARA SI;
Devolver NULL;
Final;
$$
Idioma PLPGSQL;

* Este código fuente se resaltó con el resaltador del código fuente.


Crea Eventos de activación_before_insert.
Antes de insertar en Analytics.Events
Para cada fila Ejecutar procedimientos analytics.events_insert_trigger ();

* Este código fuente se resaltó con el resaltador del código fuente.

5. Todo está listo, ahora tenemos una tabla particionada Analytics.Events. Podemos comenzar a analizar violentamente sus datos. Por cierto, verifique las restricciones, creamos no solo para proteger las secciones de datos incorrectos. PostgreSQL puede usarlos al elaborar un plan de solicitud (sin embargo, con un índice de vida en evento_time, las ganancias lo darán como mínimo), es suficiente para usar la Directiva de restricciones_exclusion:

Establecer restricción_exclusión \u003d en;
Seleccione * de Analytics.Events donde Event_Time\u003e Current_Date;

* Este código fuente se resaltó con el resaltador del código fuente.

Final de la primera parte
¿Entonces que tenemos? Veamos:
1. La tabla de eventos, dividida en secciones, el análisis de los datos disponibles durante el último día se vuelve más fácil y más rápido.
2. El horror de la realización de que todo esto necesita para mantener de alguna manera, cree las secciones a tiempo, sin olvidar cambiar el gatillo en consecuencia.

Acerca de lo fácil y descuidado, el trabajo con tablas particionadas se dirá en la segunda parte.

UPD1: Repartiendo partición reemplazada
UPD2:
Según los comentarios de uno de los lectores que no tienen, desafortunadamente, la cuenta en HABRÉ:
Con la herencia, se conectan unos momentos, que deben tenerse en cuenta al diseñar. Las secciones no heredan la clave principal y las teclas externas en sus columnas. Es decir, al crear una sección, debe crear explícitamente la clave principal y las claves externas en las columnas de la sección. Desde mí, observo que la creación de clave externa en las columnas de la tabla particionada no es la mejor manera. En la mayoría de los casos, una tabla particionada es la "tabla de hechos" y se refiere a la mesa de "dimensión".

Buenas noches / día / por la mañana, ¡querido Hermaloudi! Seguimos desarrollando y complementamos el blog sobre mi código abierto favorito RDBMS PostgreSQL. Fue milagrosamente, así que resultó que el tema del tema de hoy nunca se ha planteado aquí. Debo decir que la partición en PostgreSQL está muy bien descrita en la documentación, pero ¿me detendrá?).

Introducción

En general, bajo partición, en general, no entienden una tecnología, sino que se acercan al diseño de la base de datos, que parecía mucho tiempo antes de que los DBMS comenzaran a mantener los llamados. Tablas particionadas. El pensamiento es muy simple, divide la mesa en varias partes de un tamaño más pequeño. Hay dos subespecies: partición horizontal y vertical.
Partición horizontal
Las partes de la tabla contienen diferentes líneas. Nos ponemos una tabla de los troncos de una determinada aplicación abstracta - registros. Podemos romperlo en partes, una para registros en enero de 2009, la otra, para febrero de 2009, etc.
División vertical
Las partes de la tabla contienen diferentes columnas. Encuentre la solicitud de partición vertical (cuando esté realmente justificada) algo más complicada que para horizontal. Como un caballo esférico, propongo considerar esta opción: la tabla de noticias tiene la identificación, texto corto, texto largo y deje que el campo de texto largo se use mucho menos que los dos primeros. En este caso, tiene sentido romper la tabla de noticias en las columnas (cree dos tablas para Shorttext y LongText, respectivamente, las teclas primarias relacionadas + Cree Ver las noticias que contienen ambas columnas). Por lo tanto, cuando solo necesitamos una descripción de las noticias, el DBMS no tiene que leer desde el disco también toda la noticia de texto.
Partition de soporte en DBMS modernos.
La mayoría de los DBMS modernos admiten la partición de las tablas de una forma u otra.
  • Oráculo - Admite la partición comenzando con 8 versión. Trabajar con secciones por un lado es muy simple (en general, no puede pensar en ellos, trabaja con una tabla regular *), y por el otro, todo es muy flexible. Las secciones se pueden romper a las "subparticiones", eliminar, dividir, transferir. Se admiten diferentes opciones para la indexación de la tabla particionada (índice particionado índice global). Referencia a una descripción voluminosa.
  • Microsoft SQL Server - El apoyo único apareció recientemente (en 2005). La primera impresión de usar - "Bueno, finalmente !! :)", el segundo - "Funciona, todo parece estar bien". Documentación en MSDN.
  • Mysql - Soportes a partir de la versión 5.1.
  • Etc ...
* -Tra, por supuesto, hay un conjunto estándar de dificultades: para crear una nueva sección a tiempo, vieja para tirar, etc., pero de alguna manera todo es simple y comprensible.

Partición en postgresql

La partición de las tablas en PostgreSQL es algo diferente en las ventas de otras bases de datos. La base para la partición es la herencia de las tablas (la cosa inherente exclusivamente PostgreSQL). Es decir, debemos tener una mesa principal (tabla maestra), y sus secciones serán las mesas herederas. Consideraremos la partición en el ejemplo de una tarea aproximada a la realidad.
Formulación del problema
La base de datos se utiliza para recopilar y analizar datos en los visitantes del sitio / sitio. Los volúmenes de datos son lo suficientemente grandes para pensar en la partición. Al analizar, en la mayoría de los casos, los datos se utilizan para el último día.
1. Crea una tabla básica:
Crea la tabla analítica. Eventos.

User_id uuid no nulo,
event_type_id de pequeño no nulo,
Event_time TimeStamp predeterminado ahora () No nulo,
URL VARCHAR (1024) NO NULL,
Referencia VARCHAR (1024),
Inet inet no nulo
);

2. Vamos a particionar por día por el campo Event_time. Por cada día crearemos una nueva sección. Llamaremos a las secciones de acuerdo con la regla: analytics.events_ddmmyyyy. Por ejemplo, una sección para el 1 de enero de 2010.
Crea la tabla analítica.events_01012010.
Event_id bigint predeterminado nextval ("analytics.seq_events") clave primaria,
Check (event_time\u003e \u003d timestamp "2010-01-01 00:00:00" y event_time< TIMESTAMP "2010-01-02 00:00:00" )
) Hereda (Analytics.Events);

* Este código fuente se resaltó con el resaltador del código fuente.


Al crear una sección, especificamos explícitamente el campo Event_ID (la clave principal no se hereda) y creamos una restricción de cheque en el campo Event_Time, para no insertar demasiado.

3. Cree un índice en el campo Event_time. Al dividir la tabla en la sección, queremos decir que la mayoría de las solicitudes a la tabla de eventos utilizarán la condición en el campo Event_Time, para que el índice en este campo nos ayude mucho.

Crear índice eventos_01012010_event_time_idx on analytics.events_01012010 usando btree (event_time);

* Este código fuente se resaltó con el resaltador del código fuente.


4. Queremos asegurarnos de insertarlo en la tabla principal, los datos resultaron ser la sección destinada para ellos. Para hacer esto, hacemos el siguiente fint: cree un disparador que administrará los flujos de datos.
Crea o reemplaza la función analytics.events_insert_trigger ()
Devuelve el gatillo como $$
Empezar.
Si (nuevo .event_time\u003e \u003d timestamp "2010-01-01 00:00:00" y
Nuevo .Event_time.< TIMESTAMP "2010-01-02 00:00:00" ) THEN
Insertar en los valores analíticos.events_01012010 (Nuevo. *);
DEMÁS.
Elevar la excepción "Fecha de% está fuera de rango. Fijar analytics.events_insert_trigger", Nuevo .event_time;
TERMINARA SI;
Devolver NULL;
Final;
$$
Idioma PLPGSQL;

* Este código fuente se resaltó con el resaltador del código fuente.


Crea Eventos de activación_before_insert.
Antes de insertar en Analytics.Events
Para cada fila Ejecutar procedimientos analytics.events_insert_trigger ();

* Este código fuente se resaltó con el resaltador del código fuente.

5. Todo está listo, ahora tenemos una tabla particionada Analytics.Events. Podemos comenzar a analizar violentamente sus datos. Por cierto, verifique las restricciones, creamos no solo para proteger las secciones de datos incorrectos. PostgreSQL puede usarlos al elaborar un plan de solicitud (sin embargo, con un índice de vida en evento_time, las ganancias lo darán como mínimo), es suficiente para usar la Directiva de restricciones_exclusion:

Establecer restricción_exclusión \u003d en;
Seleccione * de Analytics.Events donde Event_Time\u003e Current_Date;

* Este código fuente se resaltó con el resaltador del código fuente.

Final de la primera parte
¿Entonces que tenemos? Veamos:
1. La tabla de eventos, dividida en secciones, el análisis de los datos disponibles durante el último día se vuelve más fácil y más rápido.
2. El horror de la realización de que todo esto necesita para mantener de alguna manera, cree las secciones a tiempo, sin olvidar cambiar el gatillo en consecuencia.

Acerca de lo fácil y descuidado, el trabajo con tablas particionadas se dirá en la segunda parte.

UPD1: Repartiendo partición reemplazada
UPD2:
Según los comentarios de uno de los lectores que no tienen, desafortunadamente, la cuenta en HABRÉ:
Con la herencia, se conectan unos momentos, que deben tenerse en cuenta al diseñar. Las secciones no heredan la clave principal y las teclas externas en sus columnas. Es decir, al crear una sección, debe crear explícitamente la clave principal y las claves externas en las columnas de la sección. Desde mí, observo que la creación de clave externa en las columnas de la tabla particionada no es la mejor manera. En la mayoría de los casos, una tabla particionada es la "tabla de hechos" y se refiere a la mesa de "dimensión".

En el curso del trabajo en tablas grandes, nos enfrentamos constantemente con problemas con el desempeño de sus actualizaciones de mantenimiento y datos. Una de las soluciones más productivas y convenientes de los problemas emergentes es la partición.
Si en palabras generales, la partición está particionando una tabla o índice a los bloques. Dependiendo de la configuración de la partición, los bloques pueden ser de varios tamaños, se pueden almacenar en diferentes grupos de archivos y archivos.
El seccionamiento tiene tanto ventajas como desventajas.
Los beneficios están bien pintados en el sitio web de Microsoft, daré un extracto:

« La partición de tablas grandes o índices puede dar las siguientes ventajas en la capacidad de administración y el rendimiento.

  • Esto le permite transferir de forma rápida y eficiencia los subconjuntos de datos y acceder a ellos, al tiempo que mantiene la integridad del conjunto de datos. Por ejemplo, tal operación, ya que la carga de datos de la OLTP en el sistema OLAP se realiza en segundos y no en minutos y horas, como en el caso de datos no a prueba de datos.
  • Las operaciones de servicio se pueden realizar más rápido con una o más secciones. Las operaciones son más eficientes, ya que se realiza solo con la conflicción de datos, y no con toda la tabla. Por ejemplo, puede comprimir los datos en una o más secciones o reconstruir una o más secciones de índice.
  • Puede mejorar la velocidad de ejecución de las solicitudes dependiendo de las solicitudes que a menudo se realizan en su configuración de hardware. Por ejemplo, el optimizador de consulta puede ser más rápido para realizar las solicitudes de Equipown de dos y más tablas particionadas si estas tablas son las mismas columnas de partición, ya que puede conectar las secciones en sí mismas.

En el proceso de clasificación de datos para las operaciones de E / S en SQL Server, la clasificación de datos sobre las secciones es el primero. SQL Server puede comunicarse simultáneamente solo un disco, lo que puede reducir el rendimiento. Para acelerar la clasificación de datos, se recomienda distribuir archivos de datos en secciones sobre múltiples discos duros mediante la creación de RAID. Por lo tanto, a pesar de la clasificación de datos por secciones, SQL Server podrá acceder simultáneamente a todos los discos duros de cada sección.
Además, es posible aumentar la productividad utilizando bloqueos a nivel de las secciones, y no en toda la tabla. Puede reducir la cantidad de conflictos de cerraduras para la tabla.
».

Las desventajas incluyen la complejidad en la administración y el apoyo de la operación de las tablas particionadas.

No habilitaremos en la implementación de la partición, ya que este problema está muy bien descrito en el sitio web de Microsoft.

En su lugar, intentaremos mostrar cómo optimizar el funcionamiento de las tablas particionadas, y mostrar más precisamente la forma óptima (en nuestra opinión) de actualizar los datos para cualquier intervalo de tiempo.

Una mesa grande y particionada es la distinción física de estas secciones. Esta propiedad nos permite cambiar las secciones en algunos lugares o con cualquier otra tabla.
Con la actualización habitual de los datos utilizando la ventana deslizante (por ejemplo, para el mes), tendremos que pasar por los siguientes pasos:

1. Encuentra las líneas deseadas en una mesa grande;
2. Eliminar las líneas encontradas de la tabla e índice;
3. Inserte nuevas líneas en la tabla, actualice el índice.

Cuando se almacenan en una tabla de miles de millones de filas, estas operaciones tomarán un tiempo bastante largo, podemos limitarnos a casi una acción: simplemente reemplace la sección deseada a la tabla preparada por adelantado (o sección). En este caso, no necesitaremos eliminar o insertar cadenas, así como debe actualizar el índice en toda la tabla grande.

Vamos de palabras a los negocios y vamos a mostrar cómo implementarlo.

1. Para comenzar, configure una tabla particionada como se escribe en el artículo especificado anteriormente.
2. Crear tablas requeridas para el intercambio.

Para actualizar los datos, necesitaremos una mini copia de la tabla de destino. Una mini copia es porque se almacenarán datos almacenados que deben agregarse a la tabla de destino, es decir, Datos en solo 1 mes. La tercera mesa vacía también deberá implementar el intercambio de datos. Por qué se necesita, lo explicaré más tarde.

Las condiciones difíciles se ponen a la mini copia y la tabla para el intercambio:

  • Antes de usar el operador del interruptor, ambas tablas deben existir. Antes de realizar la operación de conmutación en la base de datos, debe haber una tabla donde la sección (tabla de origen) se mueva desde donde la tabla de selección (tabla de destino).
  • La sección del destinatario debe existir y debe estar vacía. Si se agrega la tabla como una sección a una tabla o sección particionada existente, se mueve de una tabla particionada a otra, la sección del destinatario debe existir y estar vacía.
  • La tabla receptora no combinada debe existir y debe estar vacía. Si la sección está diseñada para formar una tabla no separada unificada, entonces es necesario que existiera la tabla que reciba una nueva sección y una tabla vacía no transicional.
  • Las secciones deben ser de la misma columna. Si la sección se cambia de una tabla particionada a otra, ambas tablas deben ser particionadas por la misma columna.
  • Las tablas de origen y destino deben estar en el mismo grupo de archivos. La fuente de origen y destino en la tabla ALTER ... Las instrucciones de conmutación deben almacenarse en el mismo grupo de archivos, así como sus columnas con valores grandes. Cualquier índice respectivo, secciones de índice o secciones indexadas también deben almacenarse en el mismo grupo de archivos. Sin embargo, puede diferir del grupo de archivos para las tablas correspondientes u otros índices relevantes.

Explicaré las restricciones en nuestro ejemplo:

1. Una mini copia de la tabla debe ser particionada en la misma columna que el objetivo. Si una mini copia no es una tabla particionada, debe almacenarse en el mismo grupo de archivos que la sección de reemplazo.

2. La tabla para el intercambio debe estar vacía y también debe particionarse en la misma columna o debe almacenarse en el mismo grupo de archivos.

3. Implementamos el intercambio.

Ahora tenemos lo siguiente:
Tabla con datos para todos los tiempos (siguiente Table_A)
Tabla con datos por 1 mes (siguiente Table_B)
Mesa vacía (siguiente Table_c)

En primer lugar, debemos averiguarlo en qué sección tengamos los datos.
Puedes encontrarlo en la consulta:

SELECCIONE
Cuenta como
, $ Partición. (DT) como
, Rango () sobre (pedido por $ partición. (DT))
De dbo. (Nolock)
Grupo por $ partición. (DT)

En esta consulta, obtenemos secciones en las que hay filas con información. La cantidad no se puede contar: lo hicimos para verificar la necesidad de intercambiar datos. Rango también usa para que pueda ir al ciclo y actualizar varias secciones en un procedimiento.

Tan pronto como se encontraron en los que se almacenan los datos, se pueden cambiar en lugares. Supongamos que los datos se almacenan en la Sección 1.

Luego necesita realizar las siguientes operaciones:
Cambie las secciones de la tabla de destino con una tabla para el intercambio.
Alterar la tabla. Cambiar partición 1 a. Partición 1.
Ahora tenemos lo siguiente:
La tabla de destino no tenía datos en la sección que necesitamos, es decir, La sección esta vacia
Swap Secciones de la tabla de destino y mini-copia
Alterar la tabla. Cambiar partición 1 a. Partición 1.
Ahora tenemos lo siguiente:
La tabla de destino apareció datos del mes, y en mini-copias ahora vacío
Clear o eliminar una tabla para el intercambio.

Si tiene un índice de clústeres en la tabla, tampoco es un problema. Debe crearse en las 3 mesas con la partición una por la misma columna. Al cambiar las secciones, el índice se actualizará automáticamente, no la reconstrucción.

Página 23 de 33

Partition de rango - Información de ventas

La naturaleza del uso de la información de ventas a menudo es cambiante. Como regla general, los datos del mes actual son los datos operativos; Los datos de los meses anteriores es en gran medida los datos previstos para el análisis. La mayoría de las veces, el análisis se realiza mensualmente, trimestral o anualmente. Dado que los diferentes analistas pueden requerir cantidades significativas de datos analíticos diferentes al mismo tiempo, la partición se permite a aislar sus actividades. En el siguiente escenario, estos datos se agotan con los 283 nodos y se suministran como dos archivos de formato ASCII estándar. Todos los archivos se envían al servidor de archivos central a más tardar a las 3.00 am el primer día de cada mes. Los tamaños de archivos fluctúan, pero en el rango promedio es de aproximadamente 86,000 pedidos por mes. Cada pedido en promedio es de 2.63 posiciones, por lo que los archivos de pedidos están en promedio en promedio en 226180 líneas. Cada mes se agrega alrededor de 25 millones de nuevos pedidos y 64 millones de filas de la nomenclatura de pedidos. El servidor de análisis de historia admite datos en los últimos 2 años. Los datos de dos años es un poco de menos de 600 millones de pedidos y más de 1.500 millones de líneas en la tabla de pedidos. Dado que los datos se analizan a menudo al comparar los indicadores de los mismos trimestres, o los mismos meses por años anteriores, se selecciona la partición de rango. Se elige un mes como el tamaño del rango.

Basado en el esquema 11 ("Pasos para crear una tabla particionada"), decidimos particionar la tabla utilizando la partición de rango en la columna Pedido. Nuestros analistas se unen principalmente y analizan los últimos 6 meses de datos, o los últimos 3 meses de la actual y el año pasado (por ejemplo, enero-marzo de 2003 más enero-marzo de 2004). Para maximizar el paquete de discos, y al mismo tiempo, aislar la mayoría de las agrupaciones de datos, habrá varios grupos de archivos en un disco físico, pero se trasladarán durante seis meses para reducir el número de conflictos cuando la separación de recursos . Mes actual - octubre de 2004, y las 283 oficinas separadas administran sus ventas actuales a nivel local. El servidor almacena datos de octubre de 2002 a septiembre de 2004 inclusive. Para aprovechar el nuevo sistema de 16 procesadores y SAN (red de área de almacenamiento, una red de alta velocidad que conecta los almacenes de datos), cada mes estará en su propio archivo de grupo de archivos, y se colocará en un conjunto de espejos alternativos ( RAID 1 + 0). La Figura 12 ilustra la colocación de datos en discos lógicos.


Figura 12: Tabla de pedidos particionados

Cada uno de los 12 discos lógicos utiliza la configuración RAID 1 + 0, por lo que el número total de discos requeridos para los pedidos y las tablas de pedidos es 48. A pesar de esto, SAN admite hasta 78 discos, por lo que los 30 discos restantes se utilizan para el registro de transacciones , Tempdb, bases de datos del sistema y otras tablas pequeñas, como clientes (9 millones de entradas) y productos (386,750 entradas), etc. Las tablas de pedidos y pedidos de pedidos utilizarán las mismas condiciones de límite y la misma ubicación en el disco; De hecho, utilizarán el mismo esquema de partición. Como resultado (eche un vistazo a dos discos lógicos E: \\ y F: \\ FIGURA 13) Los pedidos de datos de la tabla y los pedidos de orden para los mismos meses se ubicarán en los mismos discos:


Figura 13: Colocación de extensiones de secciones de rango en matrices de disco

Aunque parece confuso, todo esto es bastante fácil de implementar. Lo más difícil de crear nuestra tabla particionada es la entrega de datos de una gran cantidad de fuentes: 283 El repositorio debe tener un mecanismo de entrega estándar. Sin embargo, en el servidor central hay solo una tabla de pedidos y una tabla de pedidos. Para convertir ambas tablas en las particiones, primero debemos crear una función y un esquema de partición. El esquema de partición determina la ubicación física de las secciones en los discos, por lo tanto, los grupos de archivos también deben existir. Dado que los grupos de archivos son necesarios para nuestras tablas, el siguiente paso es su creación. Sin embargo, la sintaxis de la creación de cada grupo de archivos es idéntica a lo anterior, sin embargo, de esta manera se deben crear todos los veinticuatro grupos de archivos. Puede cambiar los nombres / ubicación de los discos por disco único para probar y explorar el sintaxis. Asegúrese de haber corregido los tamaños de archivos en el MB en lugar de GB, y han elegido un tamaño de archivo inicial más pequeño, según el espacio en disco disponible para usted. Se crearán veinticuatro archivos y grupos de archivos en la base de datos de SaalesDB. Todos tendrán sintaxis similares, con la excepción de la ubicación, nombre de archivo y nombre de archivo:

ALTER SALESDB.
Agregar archivo.
(NOMBRE \u003d N "SALESDBFG1FILE1",
Nombre de archivo \u003d N. "E: \\ salesdb \\ salesdbfg1file1.ndf",
Tamaño \u003d 20GB,
MAXSIZE \u003d 35GB,
FileGrowth \u003d 5GB)
Al grupo de archivos
Ir.

Una vez que se crean todos los veinticuatro archivos y grupos de archivos, puede determinar la función y el esquema de partición. Asegúrese de que se creen sus archivos y grupos de archivos, puede usar SP_HELPFILE y SP_HELPFILEG SISTEMA SISTEMA DE PROCEDIMIENTOS ALMACENADOS.

La función de sección se determinará por la columna Pedido con el tipo de datos DateTime. Para que ambas tablas sean particionadas por la columna Pedido, esta columna debe estar presente en ambas tablas. De hecho, los valores de las teclas de teclas de ambas tablas (si ambas tablas se dividen por una y la misma tecla) se duplicarán entre sí; Sin embargo, esto es necesario para obtener las ventajas de la alineación, en la mayoría de los casos, el tamaño de las columnas clave será relativamente pequeño (el tamaño del campo DateTime es de solo 8 bytes). Como ya se ha descrito en la "Crear función de partición para las secciones de rango", nuestra función será un rango de función de partición en la que la primera condición de límite estará en la primera sección (izquierda).

Crear función de partición TwoyearDaterangePFN (DateTime)
Como
Gama izquierda para valores ("20021031 23: 59: 59.997", - Oct 2002
"20021130 23: 59: 59.997", - nov 2002
"20021231 23: 59: 59.997" - diciembre de 2002
"20030131 23: 59: 59.997" - ene 2003
"20030228 23: 59: 59.997" - febrero de 2003
"20030331 23: 59: 59.997" - mar 2003
"20030430 23: 59: 59.997" - abr 2003
"20030531 23: 59: 59.997" - mayo de 2003
"20030630 23: 59: 59.997", - jun 2003
"20030731 23: 59: 59.997" - jul 2003
"20030831 23: 59: 59.997" - ago 2003
"20030930 23: 59: 59.997" - sep 2003
"20031031 23: 59: 59.997" - oct 2003
"20031130 23: 59: 59.997" - nov 2003
"20031231 23: 59: 59.997" - diciembre de 2003
"20040131 23: 59: 59.997", - ene 2004
"20040229 23: 59: 59.997", - febrero de 2004
"20040331 23: 59: 59.997" - mar 2004
"20040430 23: 59: 59.997" - abr 2004
"20040531 23: 59: 59.997" - mayo de 2004
"20040630 23: 59: 59.997" - jun 2004
"20040731 23: 59: 59.997", - jul 2004
"20040831 23: 59: 59.997" - Ago 2004
"20040930 23: 59: 59.997") - sep 2004
Ir.

Dado que está extremadamente izquierdo, y se cubren los casos de límites extremadamente correctos, esta función de partición en realidad crea 25 secciones. La tabla admitirá la 25ª sección que permanecerá vacía. Para esta sección vacía, no se requiere ningún grupo de archivos especial, ya que no se deben obtener datos. Para garantizar que no haya datos en ella, la restricción limitará el rango de esta tabla. Para enviar datos a los discos correspondientes, se utiliza un esquema de partición que muestre las secciones a los grupos de archivos. El esquema de partición utilizará la definición explícita de grupos de archivos para cada uno de los 24 grupos de archivos que contengan los datos y la principal, para la 25ª sección vacía.

Crear esquema de partición.
Como
Partición twoyeardaterangepfn a.
(, , , , , ,
, , , ,,,
,,,,,,
,,,,,,
Ir.

La tabla se puede crear con la misma sintaxis que admite las versiones anteriores de SQL Server, utilizando el grupo de archivos predeterminado o definido por el usuario (para crear una tabla no particionada), ya sea utilizando el esquema (para crear una tabla particionada). En cuanto a qué opción es preferible (incluso si esta tabla se divide en el futuro, todo depende de cómo se llene la tabla y cuántas secciones va a manipular. Llenar un montón (montón) y la creación posterior de un índice de clústeres en él es probable que proporcione un mejor rendimiento que la descarga a una tabla que contiene un índice de clúster. Además, en los sistemas multiprocesador, puede cargar datos en la tabla en paralelo, y luego también paralelo a los índices. Como ejemplo, cree la tabla de pedidos y cargue los datos en ella usando Insertar ... Seleccione Suelncias. Para crear la tabla de pedidos como particionada, defina el esquema de partición en el operador de tabla Crear.

Crea SalesDB de mesa ..
NO NULO,
NULO
NULO
NULO
NULO
NULO
NO NULO,
NULO
NULO
NULO
NO NULO,
NULO
Ordenamientos de restricción
Check (\u003e \u003d "20021001"
Y.< "20041001" ),
NULO

Ir.

Dado que la tabla ODDETETAILS va a usar el mismo esquema, debe incluir la columna Pedido.

CREAR MESA. (
NO NULO,
NO NULO,
NULO
NULO
NULO
NULO
NULO
NO NULO
Pedido de restricciónDetailsRangeYearck.
Check (\u003e \u003d "20021001"
Y.< "20041001" ),
NULO
NO NULO
Restricción.
Predeterminado (GetDate ())
Como ((*))
COMO ((-))
Ir.

En el siguiente paso, se descargan los datos de la nueva base de datos de capacitación de Adventureworks. Asegúrese de haber instalado la base de datos de Adventureworks.

Insertar DBO.
Seleccione O.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
, o.
De Adventureworks.purchasing.purchaseorderheader como o
Donde (\u003e \u003d "20021001"
Y.< "20041001" )
Ir.

Insertar DBO.
Seleccione od.purchaseOrderid
, Od.linenumber
, Od.productid
, Od.unitprice.
, Od.orderqty
, Od.ReceiveQty
, OD.RECHECEDQTY
, O.orderdate.
, od.duedate.
, Od.modifieddate.
De Adventureworks.purchasing.purchaseorderdetail como OD
Únete a AdventureWorks.purchasing.purchaseorderadyer como o
En o.purchaseOrderid \u003d od.purchaseOrderid
Donde (O.\u003e \u003d "20021001"
Y o.< "20041001" )
Ir.

Ahora que descargó los datos en la tabla particionada, puede usar la nueva función del sistema incorporado para determinar la sección en la que se ubicarán los datos. La siguiente solicitud de cada una de las secciones que contienen datos devuelve información sobre cuántas filas está contenida en cada una de las secciones, así como el valor mínimo y máximo del campo Pedido. La sección que no contiene filas no cae en el resultado final.

Seleccione $ partición.TwoyearDaterangePFN (O.Orderdate)
Como
, Min (o.orderdate) como
, Max (o.orderdate) como
De dbo.orders como o
Grupo por $ partición.TwoyearDaterangePFN (O.Orderdate)
Ordenar por.
Ir.

Seleccione $ partición.TwoyearDaterangePFN (od.orderdate)
Como
, Min (od.orderdate) como
, Max (od.orderdate) como
, Cuenta como
De dbo.orderdetails como OD
Grupo por $ partición.TwoyearDaterateRePFN (od.orderdate)
Ordenar por.
Ir.

Finalmente, ahora, después de descargar los datos, puede crear un índice de clústeres y una clave externa (clave externa) entre las tablas de pedidos y pedidos. En este caso, el índice de clústeres se construirá en la clave principal (clave principal) de la misma manera que identifique estas dos tablas por su clave de partición (para solicitar detalles en el índice, agregará la columna de lino para la singularidad). De forma predeterminada, al construir índices en una tabla particionada, están alineados con respecto a la tabla particionada de acuerdo con el mismo esquema de partición; No es necesario especificar el esquema.

Alterar las órdenes de la tabla.
Añadir pedidos de restricciónPK.

Ir.




Ir.

La sintaxis completa que determina el esquema de partición, se vería así:

Alterar las órdenes de la tabla.
Añadir pedidos de restricciónPK.
Clave primaria agrupada (ordenado, ordenido)
En twoyeardaterangepscheme (ordenado)
Ir.

Alterar tabla dbo.orderdetails
Agregar pedidos de restricciónDetailsPK.
Clave primaria agrupada (ordenado, ordenido, lino)
En twoyeardaterangepscheme (ordenado)
Ir.



¿Te gustó el artículo? Compártelo