Tenemos esta gran base de datos (> 1TB) que pretendemos "reducir". La base de datos gira en torno a una entidad principal, llamémosla "Visita". Para la discusión, digamos que es una base de datos para una práctica médica.
Hay un total de 30 "tipos" de visita, como procedimiento, anual, seguimiento, inmunización, etc. Cada uno de ellos es una tabla secundaria para "Visita", por ejemplo, "visit_immuno".
La base de datos ha acumulado unos 12 años de datos desde 2000. Alguien ha propuesto que mantengamos unos 3 años de datos en la versión "en vivo" y que el resto viva en una base de datos "old_data". La fecha SOLO se almacena en la tabla "Visita" ya que está normalizada. La tabla Visita también contiene una ROWVERSION
columna y una columna BIGINT
de pseudoidentidad (agrupada). Para todos los efectos, supongamos que la clave de agrupación está poblada por una SECUENCIA (SQL Server 2012 Enterprise): la nombraremos cid
.
El visit.date
no es siempre en el mismo orden que la clave de agrupación, por ejemplo, cuando un médico va en las visitas extendidas y regresa con su "maletín" de datos, que se combinó en la tabla principal. También hay algunos cambios a la tabla "visita" que hará que la ROWVERSION
columna que se va fuera de sincronía con los dos cid
y date
columnas - en pocas palabras, ni ROWVERSION
tampoco cid
harían claves de partición adecuados para ello.
La regla empresarial para eliminar datos de la "vida" es que visit.date
debe ser mayor de 36 meses yvisit_payment
debe existir un registro secundario . Además, la base de datos "old_data" no contiene ninguna de las tablas base, excepto visit%
.
Entonces terminamos con:
Live DB (uso diario): todas las tablas DB de datos antiguos: datos anteriores para las visit%
tablas
La propuesta requiere una base de datos combinada que sea un shell que contenga sinónimos para TODAS las tablas base en Live DB
(exceptovisit%
) más Vistas que UNIONEN TODAS en las visit%
tablas en las dos bases de datos.
Suponiendo que se crean los mismos índices en la base de Old-Data
datos, ¿las consultas funcionarán bien en las vistas UNION-ALL ? ¿Qué tipo de patrones de consulta podrían disparar el plan de ejecución para UNION-ALL? vistas ?
Respuestas:
Por conveniencia, suponga que se llama a
LiveDb
la base de datos en vivo y se llama a la base de datos achiveArchiveDb
LiveDb
apuntar a las tablas en laArchiveDb
base de datos a través de un sinónimo (no es necesario hacer un db combinado con sinónimos)visit.date
y desnormalizar esta columnavisit_payments
también si aún no está allí (esto mejora el rendimiento de la unión compartida)LiveDb
para que todas las uniones a las tablas más pequeñas se mantengan localesLiveDb
yArchiveDb
eso describe el rango devisit.date
contenido en la tabla. Esto ayuda al optimizador a eliminar la tabla de archivo de las búsquedas y escaneos que contienen la columnavisit.data
. Tendrá que actualizar periódicamente esta restricción.visit.data
. Esto se suma a la sugerencia que ya proporcionó en la restricción de verificación. Esto maximiza la posibilidad de que los filtros se presionenAchiveDb
en modo de recuperación SIMPLE si aún no lo está. No es probable que necesite copias de seguridad del registro de transacciones deArchiveDb
LiveDb
yArchiveDb
Todo lo anterior no garantiza que el optimizador eliminará las tablas de archivo de las búsquedas y escaneos, pero lo hace más probable.
Cuando la eliminación no ocurre. Estos son los efectos que puede ver (esta lista puede estar incompleta). Para las búsquedas, obtendrá una búsqueda adicional en cada consulta (esto activa IOPS). Para los escaneos, los resultados pueden ser desastrosos para el rendimiento, ya que puede terminar escaneando tanto el archivo como las tablas en vivo. Estas son las formas típicas en que puede activar el optimizador:
visit%
tablas y no las incluyevisit.data
en los criterios de unión (es por eso que desea desnormalizar). Debido a esto, es posible que desee modificar algunas de sus consultasvisit.data
y otra tabla (por ejemplo, una dimensión de fecha), es posible que no obtenga la eliminación correcta de tablasvisit.data
, por ejemplo, busque directamente en la tecla de la vista.Para el último escenario, puede protegerse contra los peores efectos agregando otra restricción de verificación en el
cid
- si esto es posible. Usted mencionó que la secuencia decid
"no limpio" con respecto a las fechas y la progresión de las filas en la tabla. Sin embargo, ¿podría mantener una tabla que contenga la información: "No haycid
más de este número desde estevisit.data
" o similar? Esto podría generar una restricción adicional.Otra cosa a tener en cuenta es que las consultas paralelas pueden generar MUCHOS más hilos una vez que consulta la vista particionada (ya que ambas "sub-tablas" estarán expuestas a las mismas optimizaciones paralelas). Por esas razones, es posible que desee limitar MAXDOP en el servidor o las consultas que son paralelas.
Por cierto, si conoce bien las consultas, es posible que ni siquiera necesite los mismos índices en las dos bases de datos (esto supone que está 100% seguro de que obtendrá la eliminación correcta de tablas). Incluso podría considerar el uso de almacenes de columnas para
ArchiveDb
.fuente
La forma en que lo hemos hecho es escribir los datos antiguos en lotes en una base de datos recién creada y eliminar los datos antiguos de db en vivo. De esa manera, ambos db son accesibles. También puede hacer una copia de seguridad de la base de datos recién creada y restaurarla en otro lugar para eliminar la gran huella de los servidores de producción. Espero que sea una solución aceptable para sus necesidades.
fuente