Do BIT
Spalten 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, BIT
anstatt BIGINT
beispielsweise. 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 BIGINT
Spalten im Gegensatz zu BIT
Spalten 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 BIT
Spalten 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 BIGINT
Spalten 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 BIT
Spalten in CCIs bietet einige Vorteile . Beispielsweise nehmen in Delta-Speicher geladene Daten mit BIT
Spalten 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 BIT
Spalten hat eine Gesamtdatengröße von 250 MB und die Tabelle mit BIGINT
Spalten 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 BIT
Spalten 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 nehmenMIN
aufID_BOOL_1
auf Ihre beiden Tabellen, ich glaube , Sie werden feststellen , dass dieBIGINT
Version tatsächlich wesentlich schneller aus diesem Grunde ist!