sql - tablas - tipos de particiones en base de datos
¿Cuál es la mejor manera de particionar tablas grandes en SQL Server? (6)
¿Está preguntando sobre las mejores prácticas en términos de diseño de bases de datos, o convenciendo a su líder para cambiar de opinión? :)
En términos de diseño ... En los viejos tiempos, a veces era necesario realizar particiones verticales para evitar las limitaciones del motor de la base de datos, donde el número de columnas en una tabla era un límite estricto, como 255 columnas. En la actualidad, los principales beneficios son puramente de rendimiento: colocar columnas poco utilizadas o blobs en una matriz de discos separada. Pero si regularmente sacas cosas de ambas mesas, es probable que sea una pérdida. Parece que su ventaja está sufriendo un caso de optimización prematura.
En términos de decir que su pista está equivocada ... eso requiere diplomacia. Si está al tanto de murmullos de descontento en términos de rendimiento, un punto de referencia es probablemente la mejor manera de mostrar la diferencia.
Cree una nueva tabla física en alguna parte con ''create table t1 as select * from view1'' y luego ejecute algunos lotes largos con la tabla dividida verticalmente y su nueva tabla. Si es tan malo como dices, la diferencia debería ser evidente.
Pero esto también puede ser una optimización prematura. Descubra lo que piensan los usuarios finales sobre el rendimiento. Si el rendimiento es lo suficientemente bueno, para alguna definición de bien, entonces no arregle lo que no está roto.
En un proyecto reciente, el desarrollador "líder" diseñó un esquema de base de datos donde las tablas "más grandes" se dividirían en dos bases de datos separadas con una vista en la base de datos principal que uniría las dos tablas de bases de datos separadas. La base de datos principal es de lo que se expulsó la aplicación, por lo que estas tablas se veían y se sentían como tablas ordinarias (excepto algunas cosas extravagantes relacionadas con la actualización). Esto parecía un ENORME problema de rendimiento. Vemos problemas de rendimiento en estas tablas pero nada que lo haga cambiar de opinión sobre su diseño. Me pregunto cuál es la mejor manera de hacerlo, o si vale la pena hacerlo.
¿Qué versión de SQL Server estás usando? SQL Server 2005 tiene tablas particionadas, pero en 2000 (o 7.0) necesitabas usar vistas de particiones.
Además, ¿cuál fue el razonamiento para colocar las particiones de la tabla en una base de datos separada?
Cuando he tenido que particionar tablas en el pasado (antes de 2005), generalmente se trata de una columna de fecha o algo similar, con una vista de varias particiones. Books Online tiene una sección que habla sobre cómo hacer esto y todas las reglas a su alrededor. Debes seguir las reglas para que funcione como debe funcionar.
La clave para recordar es que su columna de partición debe ser parte de la clave principal y desea intentar usar siempre esa columna en cualquier acceso contra la tabla para que el optimizador pueda ignorar las particiones que no deberían verse afectadas por la consulta.
Busque "tabla particionada" en MSDN y podrá encontrar un tutorial más completo para las tablas con particiones de SQL Server 2005, así como consejos sobre cómo configurarlas para obtener el máximo rendimiento.
El particionamiento no es algo que deba emprenderse a la ligera, ya que puede haber muchas implicaciones de rendimiento sutiles.
Mi primera pregunta es ¿se refiere usted simplemente a colocar objetos de tabla más grandes en grupos de archivos separados (en husos separados) o se refiere a la partición de datos dentro de un objeto de tabla?
Sospecho que la situación descrita es un intento de tener el almacenamiento físico de ciertas tablas grandes en diferentes husos del resto de las tablas. En este caso, agregar la sobrecarga adicional de bases de datos separadas, perder la capacidad de aplicar integridad referencial en las bases de datos y las implicaciones de seguridad de permitir el encadenamiento de propiedad de bases de datos cruzadas no proporciona ningún beneficio sobre el uso de múltiples grupos de archivos dentro de una única base de datos. Si, como es muy posible, las bases de datos separadas a las que hace referencia en su pregunta ni siquiera están almacenadas en husos separados, pero están todas almacenadas en el mismo huso, usted niega incluso el leve beneficio de rendimiento que podría haber obtenido al separar físicamente la actividad de su disco no han recibido absolutamente ningún beneficio.
Sugeriría en lugar de utilizar bases de datos adicionales para contener tablas grandes que busque en el tema Grupo de archivos en los Libros en pantalla de SQL Server o para una revisión rápida, consulte este artículo: http://www.mssqltips.com/tip.asp?tip=1112 .
Si está interesado en la creación de particiones de datos (incluida la partición en varios grupos de archivos), le recomiendo que lea artículos de Kimberly Tripp, quien ofreció una excelente presentación cuando se publicó SQL Server 2005 sobre las mejoras disponibles allí. Un buen lugar para comenzar es este documento: http://www.sqlskills.com/resources/Whitepapers/Partitioning%20in%20SQL%20Server%202005%20Beta%20II.htm .
No creo que ganes nada partiendo la tabla en varias bases de datos en un solo servidor. Todo lo que esencialmente ha hecho allí es aumentar la sobrecarga al trabajar con la "tabla" en primer lugar al tener varias instancias (es decir, abrir en dos bases de datos diferentes) en una sola instancia de SQL Server.
¿Qué tan grande de un conjunto de datos tienes? Tengo un cliente con una tabla de 6 millones de filas en SQL Server que contiene datos de ventas de 2 años. Lo usan de forma transaccional y para informar sin problemas de velocidad notables.
Ajustar los índices y elegir el índice agrupado correcto es crucial para el rendimiento, por supuesto.
Si su conjunto de datos es realmente grande y está buscando una partición, obtendrá más por su dinero dividiendo la tabla en servidores físicos.
No estoy de acuerdo con la suposición de que no se puede ganar nada mediante la partición.
Si los datos de la partición están alineados física y lógicamente, entonces el IO potencial de las consultas debería reducirse drásticamente.
Por ejemplo: tenemos una tabla que tiene campo de lote como INT que representa un INT.
Si dividimos los datos por este campo y luego volvemos a ejecutar una consulta para un lote en particular, deberíamos poder ejecutar las estadísticas io ON antes y después del particionamiento y ver una reducción en IO,
Si tenemos un millón de filas por partición y cada partición se escribe en un dispositivo separado. La consulta debería poder eliminar las particiones no esenciales.
No he hecho muchas particiones en SQL Server, pero sí tengo experiencia en particiones en Sybase ASE, y esto se conoce como eliminación de particiones. Cuando tenga tiempo, voy a probar el escenario en una máquina SQL Server 2005.
Existe un beneficio definitivo para la partición de tablas (independientemente de si se trata de grupos de archivos o discos iguales o diferentes). Si la columna de partición está seleccionada correctamente, se dará cuenta de que sus consultas solo afectarán a la partición requerida. Así que imagínense si tienen 100 millones de registros (he dividido tablas mucho más grandes que eso - alrededor de 20+ mil millones de filas) y si en la mayoría de los casos más del 70% de su acceso a datos es solo una cierta categoría, línea de tiempo o tipo de datos entonces ayuda a mantener la información más visitada en una partición separada. Además, puede alinear la partición con grupos de archivos separados con varios tipos de discos (SATA, Fibre Channel, SSD) para que la mayoría de los datos de acceso / ocupado estén en el almacenamiento más rápido y los menos / rarey accedidos prácticamente en discos más lentos.
Aunque, en SQL Server hay una capacidad de particionamiento limitada a diferencia de Oracle. Puede elegir solo una columna para particionar (incluso en sql 2008). Así que debe elegir sabiamente una columna donde esa columna también forma parte de la mayoría de sus consultas frecuentes. Para la mayoría de las personas, resulta fácil elegir la partición por una columna de fecha. Sin embargo, aunque parece lógico dividirse de esa manera, si sus consultas no tienen esa columna como parte de la condición, no obtendrá los beneficios suficientes de la partición (en otras palabras, su consulta afectará a toda la partición).
Es mucho más fácil realizar particiones para las bases de datos de datawarehouse / data mining que OLTP, ya que la mayoría de las consultas de bases de datos de DW están limitadas por un período de tiempo.
Es por eso que en estos días debido al volumen de datos manejados por las bases de datos, es aconsejable diseñar la aplicación de tal manera que cada consulta sea limitada por algún grupo más amplio, como el tiempo, la ubicación geográfica o tal que cuando se elijan dichas columnas para particionando obtendrá los máximos beneficios.