¿Cómo almacenar 'n' días de registros del servidor web en SQL Server?

18

Para informes más rápidos y análisis de rendimiento, queremos insertar los registros de nuestro servidor web en SQL Server. Esto nos permitirá ver patrones de tráfico, problemas, ralentizaciones en tiempo casi real.

Tenemos un demonio que escucha los eventos de solicitud / respuesta de nuestro equilibrador de carga y las inserciones masivas en la base de datos.

Sin embargo, obtenemos alrededor de 1 GB de registros por día y solo necesitamos mantener alrededor de una semana (al menos en esta forma cruda).

¿Cuál es la mejor manera de almacenar estos datos y la mejor manera de eliminar entradas antiguas?

Hemos hablado sobre almacenar los datos de cada día en su propia tabla, por ejemplo, Log_2011_04_07tendría todas las entradas para ese día y luego descartaría la tabla más antigua. Se podría crear una vista para abarcar todas las tablas del día para facilitar la consulta. ¿Es factible?

Jarrod Dixon
fuente
Esta es una pregunta muy similar pero para Oracle; la sintaxis obviamente diferirá, pero esta es una aplicación clásica de partición por fecha. No es necesario reinventar la rueda :-)
Gaius el

Respuestas:

17

Deberías buscar particiones.

http://technet.microsoft.com/en-us/library/dd578580%28SQL.100%29.aspx

Lo bueno de la partición es que solo tiene un nombre de tabla (a diferencia del enfoque de tabla múltiple), por lo que sus instrucciones de inserción permanecen estáticas. Funciona con todas las aplicaciones: es completamente transparente para las consultas. Tampoco tiene que preocuparse por lo que sucede si termina con diferentes índices o estadísticas en cada una de las tablas.

Crea una función de partición que decide cómo dividir la tabla en varias tablas detrás de la escena. La función solo puede tomar un parámetro / campo de entrada, y en su caso, sería un campo de fecha. La función puede dividir la tabla por fecha, semana, mes o año; en su caso, desearía una fecha, un período de 24 horas.

Luego, cree un trabajo del Agente SQL Server que use T-SQL para intercambiar la última partición todos los días. La eliminación se convierte en una operación de metadatos y es increíblemente rápida. Cambie la partición, luego suelte la antigua.

SQLRockstar
fuente
Analizaré eso: ¿permite la eliminación de particiones individuales, por lo que las eliminaciones pueden ir rápidamente?
Jarrod Dixon
3
Sí, debería considerar específicamente el concepto de "Partición de ventana deslizante automática". Una buena serie de artículos que puede encontrar en SQLServerCentral: parte1 , parte2 y parte3 .
Marian
7

Desarrollamos un producto de registro de estadísticas web hace 6 años que nos permite rastrear cada clic de la visita de un usuario.

Lo que hicimos fue registrar cada visita mientras escribía y hacer que el daemon programado analizara los registros y normalizara los datos para una búsqueda posterior. Tan pronto como se analizaron los datos / registros, se eliminaron para mantener baja la estructura de datos.

Para nuestra próxima versión del producto, distribuiremos los recolectores masivos por separado en los sitios web y luego usaremos el daemon para recopilar los datos y limpiarlos luego emitiendo comandos para el servicio masivo.

De esta manera podemos manejar un "mantenimiento programado" sin perder datos.

Con respecto al problema de limpieza en el servidor central, nuestro plan actual es agregar "marcas de tiempo" para poder archivar datos después, por ejemplo. 3 meses.

Hemos pensado esto al igual que las texturas MIP-MAP en los juegos / renderizados 3D. Cuanto más se acerque, más datos detallados, más lejos, más "agrupados" y menos detallados.

Entonces, día a día, podemos observar los patrones de los visitantes, pero después de 3 meses, esos datos no son realmente relevantes y los comprimimos en menos detalles.

No hemos decidido si dividiremos la base de datos en fragmentos para que esto mantenga el "nivel de detalle" separado. base de datos. Pero podríamos hacerlo, ya que hay algunos problemas de nombres si almacenamos diferentes niveles en la misma base de datos.

¿Espero que puedas usar esto para algo? No puedo proporcionarle un código de ejemplo como parte del producto de nuestra empresa.

BerggreenDK
fuente
1

Cree otra tabla Daily_tables con dos columnas: Table_name y Date_table_created. En su código que crea una nueva tabla diaria (que carga los registros web), agregue otra entrada para completar la tabla Daily_tables con el nombre de la tabla creada y la marca de tiempo (fecha y hora actual). Cree un trabajo de agente SQL que ejecutará un script TSQL todas las semanas. El TSQL debería descartar todos los nombres de tablas (Table_name) de las Tablas diarias con una marca de fecha y fecha_creada que sea anterior a 7 días.

Espero que esto sea lo que estabas buscando :)

StanleyJohns
fuente