Domanda

sto lavorando sotto il refactoring del database di schema (SQL Server 2008) e raccogliere argomenti per colonne NCHAR(1) cambiamento (che mantengono i valori Y|N) per BIT. Ognuno capire questo è necessario e non so perché lo fa avvenire, ma questo cambiamento influisce database di produzione in modo sono necessari argomenti gravi. Tabella mantiene catalogo indirizzo (fino a 1 m di record).

Il primo argomento che ho trovato - ogni nchar campi prendono 2 byte , ogni 8 campi di bit - 1 byte (8 successivo - ulteriore 1 byte).

Quali sono le prospettive? Forse alcuni problemi di indici di performance?

È stato utile?

Soluzione

Un campo di bit aiuta la tua logica imponendo automaticamente ciò che è attualmente una regola implicita di business (vale a dire, questa colonna può contenere solo 'Y' o 'N'). Se stai far rispettare questa regola a livello di codice, è possibile risparmiare, eliminando il carico di. Indicizzare una colonna di bit di propria ha poco valore a causa della bassa cardinalità, ma potrebbe essere utile come parte di un indice composito.

Vedi anche:

Altri suggerimenti

I esiterei a fornire tutti gli argomenti per un tale cambiamento a meno che non si aveva una buona ragione per fare questo cambiamento. vale a dire si deve bilanciare il costo di una modifica a quello che si personalmente di fatto / preferire, contro il costo di effettiva attuazione e le prestazioni.

Hai controllato se l'uso di nchar (1) è male le prestazioni, o stai cadendo nella trappola di prematura ottimizzazione? Siete solo parlando di circa 1 milione di record qui.

Per la conservazione minore / IO costo si pensa che si sono incorrere, considera il totale delle ore uomo al cambiamento, ripetere il test e l'aggiornamento del sistema * tariffa oraria vs costo di un semplice acquisto di un disco più veloce. Ho il sospetto che il disco sarà molto più economico -. Così come beneficio ogni aspetto del sistema

Un motivo comune per trovare NCHAR (1) invece di bit è che Oracle non ha sostenuto un tipo di bit. Se tu avessi un Oracle o sviluppatore Oracle-addestrati, o di un database che ha usato per girare su Oracle, dovrai vedere questo molto. In SQL Server, non c'è davvero alcun bisogno di questo.

Tuttavia, ho trovato che la maggior parte dei luoghi in cui ho un campo di bit (o NCHAR (1) in Oracle) quello che davvero vogliono è un datetime che indica non tanto il valore del bandiera, ma esattamente quando è diventato vero. Questo non è sempre quel caso, ma quando ripenso circa vecchio codice che ho scritto direi che 4 su 5 volte che ho usato un campo di bit avrei dovuto usare un datetime.

Crea il campo di bit, aggiungere una colonna calcolata che emula il nchar (1) per il momento.

Cosa non usare nchar:

  • Y vs y vs qualche unicode Y
  • Overhead di controllo Y o N
  • Non è nativamente "vero" o "falso" (ad esempio, non sarà mappare direttamente alla .net booleano)
  • Y e N sono inglese. Ja / Nein, Oui / Non etc

Non si dovrebbe indicizzare questo comunque, quindi si tratta di stoccaggio e l'uso efficiente. bit è

  • piccolo
  • tipo di dati di sicurezza (ad esempio, nessun controllo necessario)
  • Mappe per cliente significa direttamente
  • indipendente regione

Detto questo, si usa un "WhenInactive" campo smalldatetime come sostituto per il campo "IsActive". NULL = attiva.

Se si utilizza LINQ2SQL o Entity Framework una colonna BIT si tradurrà in un bool, ma NCHAR(1) si tradurrà in un string.

E 'il campo utilizzato ampiamente nelle query Where fld = 'Y'?

Se è così mi piacerebbe prendere in considerazione facendo un test per vedere se o non a cambiarlo con prestazioni impatti bit.

Modifica ora solo perché dovrebbe essere un campo di bit in quanto si sta memorizzare i valori booleani su un tavolo di 1m + record non suona come una buona idea per me neanche e mi piacerebbe andare con @ risposta di Andrew.

Usa Bit:

  • rappresentazione logico / espressività di intenti - dal momento che gli stati booleani non sono sempre esprimibile costantemente come Yes or No, che poi significa che si dovrà o essere incoerenti nella modellazione di bit, o non-intuitivo, ad esempio, True/False (T/F), On/Off (?O/F), Open/Closed(O/C) etc.

  • integrità referenziale - bit non annullabile può essere limitato al solo 0 or 1. A meno che non si aggiunge vincoli, il tuo *char(1) potrebbe essere Y, N, X o .

  • bit possono essere imballati , quindi potrebbe avere archiviazione più piccolo.

  • Re: Performance: indicizzazione di bit (o pochi-Stato CHAR) colonne di solito è uno spreco, a meno che non ci sia elevata selettività di 0 o 1 nei dati. In questo caso, un Filtered indice sul valore selettivo sarebbe una buona idea.

(migrati da cancellato risposta qui )

Ho avuto un paio di occasioni in cui volevamo un campo di bit, ma non poteva sapere con certezza non ci sarebbe mai la necessità di un terzo o quarto valore in quel campo. Abbiamo quindi strutturato come un campo di stringa contenente Y o N. Naturalmente, abbiamo fatto solo questo in situazioni molto particolari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top