Estoy importando datos del mercado accionario brasileño a una base de datos de SQL Server. En este momento tengo una tabla con información de precios de tres tipos de activos: acciones, opciones y forwards. Todavía estoy en datos de 2006 y la tabla tiene más de medio millón de registros. Tengo más 12 años de datos para importar, por lo que la tabla superará un millón de registros.¿Cuál es su enfoque para optimizar tablas grandes (+ 1M filas) en SQL Server?
Ahora, mi primer enfoque para la optimización era mantener los datos a un mínimo, lo que reduce el tamaño de fila a un promedio de 60 bytes, con las siguientes columnas:
[Stock] [int] NOT NULL [Date] [smalldatetime] NOT NULL [Open] [smallmoney] NOT NULL [High] [smallmoney] NOT NULL [Low] [smallmoney] NOT NULL [Close] [smallmoney] NOT NULL [Trades] [int] NOT NULL [Quantity] [bigint] NOT NULL [Volume] [money] NOT NULL
Ahora, segundo enfoque para la optimización era hacer un índice agrupado. En realidad, el índice principal se ajusta automáticamente y lo convertí en un índice compuesto con los campos Stock y Fecha. Esto es único, no puedo tener dos datos de cotización para la misma acción en el mismo día.
El índice revisado se asegura de que las cotizaciones de la misma acción permanezcan juntas, y probablemente ordenadas por fecha. ¿Es esta segunda información verdadera?
En este momento, con medio millón de registros que está tomando alrededor de 200 ms para seleccionar cotizaciones de un activo específico. Creo que este número aumentará a medida que la mesa crezca.
Ahora, para un tercer enfoque, estoy pensando en dividir la tabla en tres tablas, cada una para un mercado específico (acciones, opciones y forwards). Esto probablemente reducirá el tamaño de la mesa en 1/3. Ahora, ¿ayudará este enfoque o no importa demasiado? En este momento, la mesa tiene 50mb de tamaño, por lo que puede caber completamente en la memoria RAM sin muchos problemas.
Otro enfoque sería utilizar la función de partición de SQL Server. No sé mucho al respecto, pero creo que normalmente se usa cuando las tablas son grandes y puede abarcar múltiples discos para reducir la latencia de E/S, ¿verdad? ¿Sería útil la partición en este caso? Creo que puedo dividir los valores más nuevos (últimos años) y los valores más antiguos en tablas diferentes. La probabilidad de buscar los datos más nuevos es mayor, y con una pequeña partición probablemente sea más rápida, ¿no?
¿Cuáles serían otros buenos enfoques para hacer esto lo más rápido posible? El uso principalmente seleccionado de la tabla será para buscar un rango específico de registros de un activo específico, como los últimos 3 meses del activo X. Habrá otros usos, pero este será el más común, ya que es posible que se ejecute en más de 3k usuarios concurrentemente.
Algunas instrucciones SELECT y/o planes de consulta ayudarían .... –