Frage

Ich arbeite unter Refactoring der Datenbank (SQL Server 2008) -Schema und sammeln Argumente zu ändern NCHAR(1) Spalten (die Y|N Werte halten) zu BIT. Jeder versteht dies notwendig ist, und weiß nicht, warum es stattfinden, aber diese Änderung betrifft Produktionsdatenbank so gewichtige Argumente erforderlich sind. Tabelle hält Adresse Katalog (bis zu 1 m von Datensätzen).

Erstes Argument, das ich gefunden - jeweils Nchar Felder 2 Bytes nehmen , die jeweils 8 Bitfelder - 1 Byte (8 nächsten - zusätzlich 1 Byte).

Was kommt als nächstes? Vielleicht einige Indizes Performance-Probleme?

War es hilfreich?

Lösung

Ein-Bit-Feld hilft, Ihre Logik, indem sie automatisch der Durchsetzung was zur Zeit eine implizite Geschäftsregel (das heißt, in dieser Spalte nur enthalten ‚Y‘ oder ‚N‘). Wenn Sie diese Regel programmatisch sind erzwingen, können Sie durch die Beseitigung dieser Aufwand sparen. Indizierung ein bisschen Spalte auf seine eigene hat wenig Wert auf Grund der geringen Mächtigkeit, aber es könnte als Teil eines zusammengesetzten Index nützlich sein.

Siehe auch:

Andere Tipps

Ich würde zögern, alle Argumente für eine solche Änderung zu schaffen, wenn Sie einen guten Grund hatte, um diese Änderung vorzunehmen. das heißt Sie haben die Kosten einer Änderung balancieren, was Sie persönlich getan / bevorzugen, gegen die Kosten, um es von der tatsächlichen Durchführung und die Vorteile würden.

Haben Sie überprüft, ob die Verwendung von nchar (1) Leistung verletzt, oder fallen Sie in die Falle der vorzeitigen-Optimierung? Sie sprechen nur etwa 1 Million Datensätze hier.

Für den kleineren Speicher / IO kosten Sie denken, Sie sind zu verursachen, sollten Sie die Gesamtarbeitsstunden zu ändern, wiederholen Sie den Test und Upgrade des Systems * Stundensatz vs Kosten für nur eine schnellere Festplatte zu kaufen. Ich vermute, dass die Platte wird viel billiger sein -. Sowie Nutzen jeden Aspekt des Systems

Ein häufiger Grund zu finden NCHAR (1) anstelle von Bit ist, dass Oracle nicht etwas Art unterstützt hat. Wenn Sie eine Oracle oder Oracle ausgebildete Entwickler haben, oder eine Datenbank, die auf Oracle läuft verwendet, sind Sie dies viel Gonna zu sehen. In SQL Server gibt es wirklich keine Notwendigkeit dafür.

Allerdings habe ich festgestellt, dass die meisten Orte, an denen ich ein bisschen Feld (oder NCHAR (1) in Oracle), was ich wirklich wollen, ist ein Datetime, die nicht so viel, den Wert der angibt, Flagge aber genau dann, wenn es wahr geworden. Dies ist nicht immer so, aber wenn ich wieder zu altem Code denke ich geschrieben habe, ich würde vermuten, dass 4 von 5 mal ich ein bisschen Feld verwenden ich einen Datetime verwendet haben sollte.

Erstellen Sie das Bit-Feld, fügen Sie eine berechnete Spalte, die die nchar (1) für jetzt emuliert.

Was Nchar nicht zu verwenden:

  • Y vs y vs einige unicode Y
  • Overhead des Prüfens Y oder N
  • Nicht nativ "true" o "false" (zB nicht direkt auf .net boolean Karte)
  • Y und N ist Englisch. Ja / Nein, Oui / Non etc

Sie sollten nicht Index dieser ohnehin so kommt es zu einem effizienten Speicherung und Nutzung nach unten. Bit

  • kleine
  • Datentyp sicher (zB keine Überprüfung erforderlich)
  • abbildet Client hier direkt
  • unabhängig von Region

Zu sagen, dass, verwenden wir ein small „WhenInactive“ Feld als Ersatz für „IsActive“ ein. NULL = aktiv.

Wenn Sie LINQ2SQL oder Entity Framework verwenden eine BIT Spalte in eine bool übersetzen, aber NCHAR(1) wird in eine string übersetzen.

Ist das Feld ausgiebig in Abfragen Where fld = 'Y' verwendet?

Wenn so halte ich würde einen Test machen, ob oder nicht, um zu sehen, es zu wenig Auswirkungen Leistung zu verändern.

ändert es jetzt, nur weil es sollte ein bisschen Feld sein, da man auf einem Tisch Boolesche Werte ist die Speicherung von 1m + Aufzeichnungen klingt nicht wie eine gute Idee zu mir entweder, und ich mit @ Andrew Antwort gehen würde.

Verwenden Bit:

  • Logische Darstellung / Ausdruckskraft des Vorsatzes - da boolean Zustände sind nicht immer konsequent als Yes or No ausdrückbar, was dann bedeuten würde, müssen Sie entweder bei der Modellierung Bits unvereinbar wären, oder nicht intuitiv, z.B. True/False (T/F), On/Off (?O/F), Open/Closed(O/C) etc.

  • Integrität Referenz - Nicht-Nullable-Bit kann nur 0 or 1 eingeschränkt werden. Es sei denn, Sie Einschränkungen hinzufügen, Ihre *char(1) könnte Y, N, X oder sein.

  • Bits verpackt werden kann, könnte so haben kleiner Speicher.

  • Re: Performance: Indizierung von Bit (oder wenige-Zustand CHAR) Spalten ist in der Regel eine Verschwendung, es sei denn, es gibt eine hohe Selektivität von entweder 0 oder 1 in den Daten. In diesem Fall wird ein gefilterter Index auf dem selektiven Wert wäre eine gute Idee sein.

(migrierte von gelöscht Antwort hier )

hatte ich ein paar Gelegenheiten, bei denen wir ein Bitfeld wollte, aber konnte nicht wissen, sicher würde es nie in diesem Bereich die Notwendigkeit eines dritten oder vierten Wert sein. Wir es daher als ein String-Feld strukturiert, die Y oder N. Natürlich taten wir dies nur in sehr einzigartigen Situationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top