Tengo una tabla con aproximadamente 1 millón a 5 millones de registros. Una pequeña parte de esos registros tiene una columna de bit establecida en 'VERDADERO'. Necesito encontrar rápidamente esos registros. Creo que ese índice puede acelerar la búsqueda en esta columna, pero tengo miedo de INSERT. De ahí mi pregunta.
La base de datos funciona como una especie de almacén de datos, por lo que hay muchos SELECT y pequeños (hasta 10-20 por día) pero INSERTs bastante grandes (hasta 200 mil registros a la vez). Me temo que las importaciones a la base de datos son más largas.
sql-server
sql-server-2005
marioosh
fuente
fuente
Respuestas:
Un índice en un bit para 1 millón de registros es inútil. El optimizador nunca lo usará, solo pagará por mantenerlo. Una alternativa mucho mejor es agregar este bit como la tecla más a la izquierda en el índice agrupado.
Pero haré un disparo a ciegas en la oscuridad y supongo que lo que tiene es un patrón de cola: los registros se sueltan en la tabla con el bit establecido en 'VERDADERO' (es decir, 'necesita procesamiento = verdadero') y luego se ve un proceso en segundo plano. para estos registros, procesa un poco y actualiza el bit a FALSE. Este es un patrón omnipresente, también conocido cariñosamente como el 'patrón de receta de desastre de rendimiento'. Recomendaría colocar los registros en la tabla y colocar una notificación (podría ser tan simple como la ID de registro recién insertada), al mismo tiempo, en una cola . Consulte Uso de tablas como colas .
fuente
Como dijo @MartinSmith, si alguna vez actualiza a SQL 2008, entonces un índice filtrado sería la solución perfecta. Sin embargo, mientras tanto, como caso general, CUALQUIER índice agregado aumentará su tiempo de carga. Índices pequeños menos que los grandes.
Una cosa que miraría es si tiene un índice existente que pueda modificarse. Suponiendo que sus consultas existentes estén usando un índice dado, luego agregar la columna de bits al final de ese índice debería tener un efecto mínimo en las inserciones y el efecto positivo que está buscando en sus consultas.
Lo siguiente a considerar es "¿Tengo muchos índices ya?" No hay una regla estricta sobre qué es "mucho", pero generalmente sigo una regla de 10 índices que es el límite a menos que REALMENTE necesite uno nuevo.
Último pensamiento, pruébelo en una instancia de prueba. Configure una tabla con unos pocos millones de filas, ejecute su carga sobre ella, agregue su índice y luego ejecute su carga nuevamente y vea si nota un aumento significativo en el tiempo de carga.
Solo usted realmente puede decidir qué es "significativo". Tengo máquinas en las que agregar 5 minutos al tiempo de carga es "significativo" y otras en las que podría ver con seguridad un aumento de un par de horas.
EDITAR:
Otra opción es dividir su tabla. Puede que tenga que usar una vista particionada si no está utilizando la edición Enterprise, pero aun así debería ayudar. Pones tus bits 0 en una partición y tus bits 1 en otra. Suponiendo que solo está insertando una versión u otra, incluso puede acelerar sus inserciones.
fuente