SQL Server: varbinary oder int zu speichern ein bit in der Maske?
Ist dort jeder möglicher Vorteil der Verwendung von int vs varbinary zum speichern von bit-Masken in Bezug auf Leistung oder Flexibilität.
Für meine Zwecke, werde ich immer tun, liest auf diese bit-Masken (keine schreibt oder updates).
InformationsquelleAutor aleemb | 2009-04-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie auf jeden Fall verwenden Sie eine
INT
(wenn Sie 32 Fahnen) oderBIGINT
(für 64-flags). Wenn Sie weitere flags, die Sie verwenden könnten,BINARY
(aber wahrscheinlich müsste man sich auch Fragen, warum brauchen Sie so viele Fahnen in der Anwendung).Außerdem, wenn Sie einen ganzzahligen Typ, die Sie verwenden können, standard bitweise Operatoren direkt ohne Konvertierung eines byte-array in einen integralen Typ.
Wenn du mehr Flaggen und verwenden
BINARY
verlieren Sie native Unterstützung für bitweise Operatoren und daher einfach support für checking-Werte. Ich würde wahrscheinlich die Prüfung für die flag-Werte auf eine client-Anwendung, aber wenn Sie die komfortable Programmierung in T-SQL das ist eine option. Wenn Sie mit C# Sie haben einBitArray
Klasse mit den notwendigen Operationen und in Java Sie haben einBitSet
Klasse.Kleinere Typen für kleinere Masken ist auch eine gute Idee.
Wie können wir verwenden Sie varbinary, wenn wir, zum Beispiel, 100 Fahnen? Kann varbinary verwendet werden, so flexibel wie int oder bigint? Es ist nicht möglich, die bitweise operation auf zwei varbinary. Wie können wir imitieren das int-flag Verhalten?
Ich würde verwenden eine
BINARY(13)
für diese (bietet Platz für 104 bits/flags). Jedoch, verlieren Sie die native Unterstützung für bitweise Operatoren. Ich aktualisiert meine Antwort auf einige Optionen.InformationsquelleAutor Ronald Wildenberg
Es ist generell besser, ein Bündel von bit-Spalten statt einer bit-Maske. Sie erhalten zusammen verpackt in die Seite, so dass Sie nicht nehmen mehr Raum. Obwohl auch ich immer scheinen zu gehen, mit einem int oder bigint-Spalte zu vermeiden, die alle den Namen der Spalte eingeben.. aber mit intellisense würde ich wahrscheinlich gehen mit der bit-Spalten.
Programmierer Unwissenheit manchmal zeigt wir machen gute Fortschritte abstrahieren low-level-Optimierungen sofort in engines und frameworks. EINZELNE BIT-FELDER: 1. Behandelt werden effizient durch den Motor (zusammen verpackt, manipuliert durch nativen code statt TSQL). 2. Aussagekräftige Namen haben machen Ihre Abfragen mehr verständlich ist (anstatt mit beliebigen bit-index-Nummern). 3. Kann über Indizes verfügen, die an Sie gestellt werden, die Beschleunigung der Abfragen. 4. Kann eine individuell konfigurierbare default Werte. 5. Sind einfacher zu überarbeiten, um eine größere Art, wenn Sie später entscheiden, der Bereich braucht mehr als zwei Staaten. etc.
Genau. Bitmasken in SQL nur töten, was SQL kann es tun - Sie werden nie in der Lage sein, um Abfragen effizient. Ergo sollten Sie nicht verwendet werden.
Es gibt zumindest einen Umstand, wo eine bit-Feld ist nötig: ein index maximal 16 Spalten, die Sie überschreiten können, mit einer Gruppe von flags, oder eine Reihe von gepackten Werte.
diese Einschränkung ist nur für die Spalten, die den Schlüssel des index (Sie können fügen Sie die bits als include-Spalten und-noch-Prädikat). Haben Sie Fälle erlebt, wo es sinnvoll war, haben mehr als 16 Boolesche Werte in den Schlüssel ein index?
InformationsquelleAutor ahains
Gut, in Anbetracht der int hat weniger Speicher und ist in der Regel ein wenig einfacher, mit zu arbeiten ich ' m nicht sicher, warum Sie verwenden würden, ein varbinary.
InformationsquelleAutor NotMe
Ich in der Regel Zustimmen @hainstech die Antwort von der Verwendung von bit-Feldern, da kann man explizit benennen Sie jedes bit-Feld, um anzuzeigen, was es speichern soll. Aber ich habe nicht gesehen, einen praktischen Ansatz zu tun Bitmaske Vergleiche mit bit-Feldern. Mit SQL-Servers bitweise Operatoren (&, |, etc...) ist es einfach, um herauszufinden, ob eine Reihe von flags gesetzt sind. Viel mehr Arbeit zu tun, die mit der Gleichheit Betreiber gegen eine große Anzahl von bit-Feldern.
InformationsquelleAutor Rick