Teradata compress functions

Aus BI-Snippets - Business Intelligence Code und Module
Wechseln zu: Navigation, Suche

Teradata Compress Functions

Tabellen können sehr groß werden und auch in Zeiten günstigen Speicherplatzes kann es sinnvoll sein, möglichst wenig Platz zu benötigen. Teradata stellt mehrere Möglichkeiten zu Verfügung, den Speicherplatzbedarf zu minimieren. Je nach Komprimierung kann dadurch neben dem Speicherplatzbedarf auch die Abfragegeschwindigkeit beeinflusst werden - sowohl positiv als auc

Column based Compression

Für die Spaltenbasierte Komprimierung stehen im Groben zwei verschiedene Varianten zur Verfügung: Algorithmic Compression und Multi-Value-Compression. Bei ersterem wird jeweils eine User-Defined-Function (UDF) zur Komprimierung und Dekomprimierung gewählt. Neben diversen vorgegebenen Funktionen können auch selbst verfasste genutzt werden. Hier besteht die Gefahr, dass die Rechenzeit für das hin- und herkomprimieren den Zeitgewinn durch die Komprimierung wieder ausgleicht und die Abfragen daher deutlich länger benötigen.

Multi-Value-Compression (MVC)

Bei der MVC wird bei der Spaltendefinition bereits eine Liste an Werten mitgegeben, die in dieser Spalte vorkommen und daher komprimiert werden sollen. Diese Werte werden dann im Column Header gespeichert und in den jeweiligen Spalten nur ein Referenzbit gesetzt, das anzeigt welcher der Werte tatsächlich in der Spalte vorhanden ist. MCV kamm bei folgenden Datentypen genutzt werden:

  • (Any numeric Type)
  • BYTE
  • VARBYTE
  • CHARACTER
  • VARCHAR
  • DATE
  • TIME and TIME WITH TIME ZONE
  • TIMESTAMP and TIMESTAMP WITH TIME ZONE

Dadurch dass die Werte lediglich woanders gespeichert werden, ist diese Komprimierung verlustfrei. Sollte in der Spalte ein Wert eingetragen werden, der nicht in der vordefinierten Liste ist, so wird dieser ganz normal (also unkomprimiert) abgespeichert. Hier zeigt sich auch die größte Schwäche von MVC: Die Erstellung der Werteliste ist nur dann sinnvoll möglich, wenn man die zu erwartenden Werte in der Spalte kennt.

NACHNAME VARCHAR(20) COMPRESS ('Meier','Meyer','Müller','Schulz'),
BUNDESLAND VARCHAR (100) COMPRESS ('Niedersachsen','Nordrhein-Westfalen','Bremen','Hamburg','Berlin','Brandenburg' ... ) ,

Hier ein Beispiel für zwei Varchar Spalten mit einer Multi-Value-Compression. Für die Spalte Nachname werden die Werte Meier, Meyer, Müller und Schulz komprimiert, während in der Spalte Bundesland sämtliche deutschen Bundesländer (ja es sind nur 6, aber ich bin faul) angegeben sind. Offensichtlich ist der Speicherplatzgewinn in der Spalte Bundesland um Längen besser, da hier alle möglichen Werte abgedeckt sind (zumindest bei deutschen Adressen). Dennoch ist die Komprimierung von Nachname kein Performanceverlust. Durch eine möglichst lange Liste an häufig vorkommenden Werten kann auch hier noch ordentlich Platz gespart werden.

Es ist durchaus möglich bei einer Dimensionstabelle, die fast auschschließlich aus Character und Varchar Feldern besteht den Platzbedarf auf 25% zu reduzieren obwohl bei den meisten Spalten eben keine vollständige Liste der Werte generiert werden konnte. Für derartige Erfolge ist es aber auch notwendig, eine entsprechend lange Zeit in die Analyse der Zieldaten zu stecken.

Nachteile von Column based Compression

Einer der wichtigsten Nachteile, die bei der Komprimierung von Spalten auftreten, ist die Tatsache, dass komprimierte Spalten nicht Teil des Primärindexes sein können. Dies kann natürlich dazu führen, dass der gewonnene Speicherplatz direkt wieder durch ungleiche Verteilung der Daten verloren geht. Es ist daher unbedingt darauf zu achten, dass immer noch eine möglichst gleiche Verteilung gewährleistet wird und ggfs muss halt ein künstlicher Index in Form eines generierten Feldes für diese Verteilung sorgen.