SQL: beste Möglichkeit, Ja / Nein-Werte zu speichern? Auf die performance in riesigen databaseen achten

Ich habe einige Spalten, wo ich im Grunde ja / nein Werte speichern muss. Zum Beispiel Benutzerstatus für aktiv oder inaktiv. Newsletter-Status für Abonnenten oder Nicht-Abonnenten

Nun, ich möchte es (in Anbetracht von Tabellen mit vielen datasätzen) wissen, ob der beste path darin besteht, ein kleines int mit der characterlänge 1 zu setzen und 1 für ja und 0 für nein zu setzen.

Ist das ein richtiger Gedanke? Oder es gibt keinen Einfluss auf die performance von DB-Abfragen, wenn nur Wörter wie "Ja", "Nein", "Aktiv", "Inaktiv", "Geschrieben" usw. verwendet werden.

Danke im Voraus.

Solutions Collecting From Web of "SQL: beste Möglichkeit, Ja / Nein-Werte zu speichern? Auf die performance in riesigen databaseen achten"

Semantisch schlage ich vor, dass Sie bit wenn es Ihnen zur Verfügung steht. Beim Betrachten der Spalte kann jeder andere Entwickler sofort feststellen, dass darin ein boolescher Wert gespeichert ist. Wenn Sie kein bit , versuchen Sie es mit tinyint . Stellen Sie sicher, dass 1 der einzige true Wert ist und 0 der einzige false Wert ist, der Konsistenz bringt. Andernfalls könnten Sie mit einer unordentlichen Mischung aus true / false , yes / no , valid / invalid , y / n und / oder t / f enden.

Der Vergleich von bit oder tinyint Werten ist wahrscheinlich nicht langsamer als der Vergleich von Strings, und selbst wenn es langsamer wäre als der Vergleich von Strings, kann ich mir nicht vorstellen, dass es einen signifikanten Effekt auf die Gesamtgeschwindigkeit hat.

Gibt es etwas, was Sie am datatyp 'Bit' nicht mögen?

Das am häufigsten unterstützte Mittel ist die Verwendung von CHAR(1) – in den meisten databaseen benötigt es den gleichen Platz wie BIT (unter der Annahme, dass BIT verfügbar ist, 1 Byte), unterstützt aber mehr Werte (26 falls nicht beachtet, 52 wenn nicht) Es gibt eine Chance, mehr Werte zu unterstützen. Im Gegensatz zu BIT ist CHAR(1) für Menschen lesbar. Außerdem wird BIT nicht in jeder database unterstützt.

Wenn Ihr RDBMS Bitmap-Indizes unterstützt, sollten Sie jedes Mal BIT verwenden. Wenn nicht, benutze, was du willst, es gibt wirklich keinen Unterschied zwischen char (1), tinyint (Byte).

Fragen Sie nur allgemein, was der effizienteste path ist, ein Ja / Nein-Flag zu speichern? Oder haben Sie ein performancesproblem?

Wenn ja, wann haben Sie das performancesproblem (spezifische Abfragen, Einsätze, Wartung usw.)? Welche Art von performancessteigerung suchen Sie? 2%? 10%? 50%?

Das Ändern von datatypen wird wahrscheinlich nur zu einer kleinen Verbesserung führen, wenn wir nicht von mehreren hundert Millionen Zeilen sprechen. Ich werde dir ein Beispiel geben. Lassen Sie uns sagen, dass, was auch immer Sie getan haben, Sie 3 Bytes pro Zeile rasiert haben. Nehmen wir an, die Tabelle enthält 100.000.000 Zeilen. Das wäre eine Ersparnis von ~ 285 mb. Vorausgesetzt, das Disk-Subsystem kann 100 MB / s bereitstellen, haben Sie ganze 3 Sekunden für einen vollständigen Tabellenscan gespeichert. Etwas sagt mir, dass die Benutzer denken würden, dass 2 Stunden und 3 Sekunden vs 2 Stunden dasselbe sind 🙂

Meine Intuition hätte gesagt, dass die Performance mit Tinyints besser gewesen wäre, aber dieser Post entblößt diesen Gedanken nicht wirklich. Diese SO- Post bietet auch einige andere interessante Meinungen.

Ich denke, dass die Durchführung von Analysen mit data, die als Zahlen gespeichert sind, normalerweise einfacher ist als characterdaten. Mit welchen anderen Programmen müssen Sie interagieren und verwenden? Zum Beispiel lesen einige meiner Analyse-Tools überhaupt keine characterdaten, daher müssen wir alle empfangenen data im Format "Ja", "Nein" etc. umcodieren.