Necesito almacenar una matriz de bits para cada registro de una tabla, admitiendo las siguientes operaciones:
Probar si se establece un bit y establecer un bit (usando SQL)
Consultar y establecer el valor usando ADO 2.8 (no ADO.NET)
Indexación (para beneficiarse de la función "índice de cobertura")
El número máximo de bits que se almacenarán en esta matriz es fijo, pero puede superar los 32 . Es decir, una columna int simple no siempre funciona.
Por lo que he visto hasta ahora, mis opciones son:
- Use varias columnas int
- Use bigint (funciona siempre que el número de bits sea <= 64)
- Usar binario
- ?
La primera opción funcionaría, pero requiere un poco de refactorización en el código que accede a los datos. La segunda opción es solo un alivio temporal, y de mis búsquedas hasta ahora no estoy muy seguro de si ADO funciona tan bien con bigint . No tengo experiencia con binarios , y no conozco ninguna otra opción.
¿Qué tipo de datos elegiría, dados los requisitos?
Si todo lo que necesita almacenar es un número moderado de valores verdadero / falso, puede usar el
bit
tipo de datos.Internamente, SQL Server almacena
bit
columnas empaquetadas en "fragmentos" de bytes. Entonces, para hasta 8bit
columnas en su tabla, SQL almacena eso como un 1 byte empaquetado; 9-16bit
columnas en 2 bytes, y así sucesivamente.No parece que vaya a acercarse al límite de la columna, por lo que parece bastante sencillo. Y, por supuesto, mantenerlos bien separados de esa manera le permite nombrar las columnas para facilitar la lectura y obtener todas las posibilidades de indexación que normalmente tendría (si los indicadores son altamente selectivos, los índices filtrados pueden ser útiles si puede apuntar a 2008+).
Hacer el empaquetado de bits usted mismo hará que sea mucho más complicado hacer indexación (probablemente
bit
columnas calculadas e indexadas para representar cada posición de la máscara ... pero entonces está peor en comparación con el usobit
directo).fuente