Do BITSpalten bieten alle Vorteile Leistung , wenn in Clustered Columns Indizes verwendet? Ich bin an Leistungsvorteilen interessiert, die sich aus der Definition einer Spalte in einer IHK ergeben, BITanstatt BIGINTbeispielsweise. Ich arbeite mit SQL Server 2016.
Ich habe ein sehr begrenztes Verständnis der Funktionsweise der CCI-Komprimierung, aber basierend auf dem, was ich gelesen und getestet habe, scheint es, dass der Datentyp (beschränkt auf exakte Zahlen, in denen ganze Zahlen gespeichert sind) bei der Spaltenspeicherkomprimierung keine Rolle spielen sollte . Wenn ich beispielsweise 10 vollständige Zeilengruppen in Tabellen mit BIGINTSpalten im Gegensatz zu BITSpalten einfüge, wird kein Größenunterschied zwischen den komprimierten Zeilengruppen angezeigt. Hier sind die Quelldaten für einen Test:
DROP TABLE IF EXISTS dbo.CCI_BIT_TEST_SOURCE;
CREATE TABLE dbo.CCI_BIT_TEST_SOURCE (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
ID_BIT BIT NOT NULL,
ID_BIGINT BIGINT NOT NULL,
INDEX CCI__CCI_BIT_TEST_SOURCE CLUSTERED COLUMNSTORE
);
INSERT INTO dbo.CCI_BIT_TEST_SOURCE WITH (TABLOCK)
SELECT
t.RN
, t.RN
, t.RN % 2
, t.RN % 2
FROM
(
SELECT TOP (10485760) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
CROSS JOIN master..spt_values t3
) t
OPTION (MAXDOP 1);
Das Einfügen in eine CCI mit 8 BITSpalten dauerte durchschnittlich 18729 ms CPU-Zeit. Die Tabelle verfügt über 56960 KB reservierten Speicherplatz:
DROP TABLE IF EXISTS dbo.CCI_BIT;
CREATE TABLE dbo.CCI_BIT (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
ID_BOOL_1 BIT NOT NULL,
ID_BOOL_2 BIT NOT NULL,
ID_BOOL_3 BIT NOT NULL,
ID_BOOL_4 BIT NOT NULL,
ID_BOOL_5 BIT NOT NULL,
ID_BOOL_6 BIT NOT NULL,
ID_BOOL_7 BIT NOT NULL,
ID_BOOL_8 BIT NOT NULL,
INDEX CCI__CCI_BIT CLUSTERED COLUMNSTORE
);
INSERT INTO dbo.CCI_BIT WITH (TABLOCK)
SELECT
ID1
, ID2
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
, ID_BIT
FROM dbo.CCI_BIT_TEST_SOURCE
OPTION (MAXDOP 1);
Das Einfügen in eine CCI mit 8 BIGINTSpalten dauerte durchschnittlich 18531 ms CPU-Zeit. Die Tabelle verfügt über 56960 KB reservierten Speicherplatz, wie zuvor:
DROP TABLE IF EXISTS dbo.CCI_NO_BIT;
CREATE TABLE dbo.CCI_NO_BIT (
ID1 BIGINT NOT NULL,
ID2 BIGINT NOT NULL,
ID_BOOL_1 BIGINT NOT NULL,
ID_BOOL_2 BIGINT NOT NULL,
ID_BOOL_3 BIGINT NOT NULL,
ID_BOOL_4 BIGINT NOT NULL,
ID_BOOL_5 BIGINT NOT NULL,
ID_BOOL_6 BIGINT NOT NULL,
ID_BOOL_7 BIGINT NOT NULL,
ID_BOOL_8 BIGINT NOT NULL,
INDEX CCI__CCI_NO_BIT CLUSTERED COLUMNSTORE
);
INSERT INTO dbo.CCI_NO_BIT WITH (TABLOCK)
SELECT
ID1
, ID2
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
, ID_BIGINT
FROM dbo.CCI_BIT_TEST_SOURCE
OPTION (MAXDOP 1);
Wir können dies auch in den Columnstore-DMVs sehen:
Die Verwendung von BITSpalten in CCIs bietet einige Vorteile . Beispielsweise nehmen in Delta-Speicher geladene Daten mit BITSpalten weniger Platz ein , da Delta-Speicher im Grunde genommen unkomprimierte Heaps sind. In Abfrageplänen basiert die Formel für die geschätzte Datengröße auf den Datentypen der Spalten im Gegensatz zur Größe der Tabelle auf der Festplatte. Die Tabelle mit BITSpalten hat eine Gesamtdatengröße von 250 MB und die Tabelle mit BIGINTSpalten hat eine Gesamtdatengröße von 880 MB. In einigen Fällen könnte die geschätzte Größe von 250 MB zu einem besseren Plan führen.
Gibt es weitere Leistungsvorteile von BITSpalten für CCIs? Oder hat geben die Daten nicht wirklich egal, solange Sie eine exakte numerische dass speichert ganze Zahlen verwenden ( BIT, TINYINT, SMALLINT, INT, oder BIGINT)?

BIT. Sie müssen also verwendenCONVERT, um eine solche Aggregation durchzuführen, und diese Konvertierung verhindert das Pushdown von Aggregaten. Wenn Sie versuchen , eine nehmenMINaufID_BOOL_1auf Ihre beiden Tabellen, ich glaube , Sie werden feststellen , dass dieBIGINTVersion tatsächlich wesentlich schneller aus diesem Grunde ist!