Pregunta

Estoy trabajando bajo refactorización de base de datos (SQL Server 2008) esquema y reunir argumentos para columnas NCHAR(1) de cambio (que mantienen valores Y|N) a BIT. Todo el mundo entiende que esto es necesario y no sé por qué se tarda lugar, pero este cambio afecta a la producción de base de datos de modo que se requieren argumentos de peso. Tabla mantiene catálogo electrónico (hasta 1 m de registros).

El primer argumento que encontré - cada uno campos nchar toman 2 bytes , cada 8 campos de bits - 1 byte (próximo 8 - 1 adicional byte).

¿Qué sigue? Tal vez algunos problemas de rendimiento índices?

¿Fue útil?

Solución

Un campo de bits ayuda a su lógica mediante la aplicación automáticamente lo que es actualmente una regla de negocio implícita (es decir, esta columna sólo puede contener 'Y' o 'N'). Si va a hacer cumplir esta norma mediante programación, se puede ahorrar mediante la eliminación de esa sobrecarga. Indexación de una columna poco en su propio tiene poco valor debido a la baja cardinalidad, pero podría ser útil como parte de un índice compuesto.

Ver también:

Otros consejos

Me dudaría en ofrecer ningún argumento para tal cambio a menos que tenía una buena razón para hacer ese cambio. es decir, que tiene que equilibrar el coste de un cambio en lo que se personalmente de hecho / prefiere, contra el costo de la aplicación real y los beneficios.

Ha comprobado si el uso de nchar (1) está perjudicando el rendimiento, o está cayendo en la trampa de la optimización prematura-? Sólo se está hablando aproximadamente 1 millón de registros aquí.

Para el almacenamiento de menor importancia / IO costos que considera que está incurriendo, tenga en cuenta el total de horas hombre para el cambio, vuelva a probar y mejorar el sistema de tarifa por hora * vs coste de sólo la compra de un disco más rápido. Sospecho que el disco será mucho más barato -., Así como beneficiarse todos los aspectos del sistema

Una razón común para encontrar NCHAR (1) en lugar de bits es que Oracle no apoyó un tipo poco. Si tenías un oráculo o desarrollador entrenado Oracle, o una base de datos que utiliza para ejecutar en Oracle, vas a ver mucho en esto. En SQL Server, no hay realmente ninguna necesidad de esto.

Sin embargo, he encontrado que la mayoría de los lugares en los que tengo un campo de bits (o NCHAR (1) en Oracle) lo que realmente queremos es una fecha y hora que indica no tanto el valor de la bandera pero exactamente cuando se convirtió en realidad. Esto no es siempre el caso, pero cuando pienso sobre el viejo código que he escrito supongo que 4 de cada 5 veces he usado un campo de bits que debería haber utilizado una fecha y hora.

Cree el campo de bits, añadir una columna calculada que emula el nchar (1) por ahora.

Lo que no debe utilizar nchar:

  • Y vs vs y algunos unicode Y
  • de arriba de la comprobación de Y o N
  • No forma nativa "verdadero" o "falso" (por ejemplo, no se asignan directamente a .NET booleano)
  • Y y N son Inglés. Ja / Nein, Oui / Non etc.

No debe dar el índice de esto de todos modos por lo que se reduce al almacenamiento y uso eficiente. bit es

  • menor
  • tipo de datos de seguridad (por ejemplo, sin verificación necesario)
  • se asigna a cliente que significa directamente
  • independiente de la región

Dicho esto, se utiliza un smalldatetime "WhenInactive" campo como sustituto de campo "IsActive". NULL = activo.

Si está utilizando LINQ2SQL o Entity Framework una columna BIT se traducirá en una bool, pero NCHAR(1) se traducirá en una string.

Es el campo que se utiliza ampliamente en las consultas Where fld = 'Y'?

Si es así me gustaría pensar en hacer una prueba para ver si es o no la cambia por el rendimiento impactos bits.

Cambiar ahora sólo porque debe ser un campo de bits ya que se está almacenando valores booleanos en una tabla de registros + 1m no suena como una idea buena para mí tampoco y me gustaría ir con @ respuesta de Andrew.

Uso de bits:

  • representación Lógico / expresividad de intención - ya que los estados booleanos no siempre se expresable consistentemente como Yes or No, que luego decir que le sea necesidad de ser inconsistente en el modelado de los bits, o no intuitiva, por ejemplo True/False (T/F), On/Off (?O/F), Open/Closed(O/C) etc.

  • integridad referencial - bit no anulable puede limitarse a solamente 0 or 1. A menos que agregue limitaciones, su *char(1) podría ser Y, N, X o .

  • Los bits se pueden embalar , por lo que podría tener almacenamiento más pequeño.

  • Re: Rendimiento: indexación de bit (o pocos-estado CHAR) columnas es por lo general una pérdida, a menos que exista una elevada selectividad de 0 ó 1 en los datos. En este caso, un Filtered índice en el valor selectivo sería una buena idea.

( elimina respuesta aquí )

Yo tenía algunas ocasiones en las que queríamos un campo de bits, pero no podía saber con certeza que nunca habría la necesidad de un tercer o cuarto valor en ese campo. Por lo tanto, hemos estructurado como un campo de cadena que contiene S o N. Por supuesto, sólo hicimos esto en situaciones muy particulares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top