Virtuelle Spalten

Auch Oracle kann sich dem Trend zur Virtualisierung nicht entziehen und bietet neben einer eigenen VM auch virtuelle Spalten an. Bzgl. des Sinns dieser Möglichkeit hatte ich bereits etliche Diskussionen ohne wirkliches Ergebnis – beschränken wir uns also auf die Fakten.

Die Idee zur Nutzung virtueller Spalten kam in einem Projekt, in welchem es u.a. um Lageinformationen von Objekten geht. Hierbei handelt es sich um Kilometrierungs-Informationen, für die es 3 verschiedene Schreibweisen gibt:

  • km_v: 124,5 + 32
  • km_e: 112450032
  • km_r: 124,532

Diese 3 Darstellung meinen exakt das Gleiche und werden von den Entwicklern in allen Tabellen mit Kilometrierungs-Informationen erwartet. Nun gäbe es die Möglichkeit, alle 3 Schreibweisen vorzuhalten. Dies bedeutet aber, Informationen redundant vorliegen zu haben. Alternativ könnte man sich für eine Schreibweise entscheiden und dem Entwickler die Umrechnung überlassen. Natürlich sind auch mehr oder weniger komplexe View-Konstrukte denkbar. Oder aber man entscheidet sich für virtuelle Spalten.

Angenommen es existiert eine Tabelle OBJEKTE mit dem Objektnamen und der Spalte KM_V:

create table objekte ( objektname varchar2 ( 100 ), km_v varchar2 ( 20 ) );

Dieser Tabelle können nun die beiden anderen Schreibweisen als virtuelle Spalten hinzugefügt werden:

alter table objekte add ( km_e as ( util.get_e_km ( km_v ) ), km_r as ( util.get_r_km ( km_v )) );

Dies setzt natürlich die Existenz der Umrechnungsfunktion im Package UTIL voraus.

Damit stehen den Entwicklern alle erwarteten Spalten zur Verfügung, die Daten werden aber nicht redundant vorgehalten.

Zu beachten sind folgende Restriktionen:

  • virtuelle Spalten können nicht als Basis weiterer virtueller Spalten genutzt werden (ORA-54012: virtual column is referenced in a column expression)
  • virtuelle Spalten können nicht über DML-Statements verändert werden (ORA-54017: UPDATE operation disallowed on virtual columns) (ORA-54013: INSERT operation disallowed on virtual columns)

Davon abgesehen verhalten sich virtuelle Spalten wie „normale“ Spalten.

Über den Data-Dictionary-View USER_TAB_COLUMNS kann herausgefunden werden, ob es sich um virtuelle Spalten handelt:

select table_name, column_name, data_type from user_tab_cols where virtual_column = ‚YES‘;

TABLE_NAME  COLUMN_NAME  DATA_TYPE =========== ============ ========== OBJEKTE     KM_E         NUMBER OBJEKTE     KM_R         NUMBER

Virtuelle Spalten können indiziert werden, um Zugriffe zu beschleunigen. Allerdings sollte beachtet werden, dass virtuelle Spalten erst beim Zugriff berechnet werden – bei performancekritischen Abfragen sollte die Nutzung also ausgiebig getestet werden.

Bildnachweise: © Fotolia_60505744_S-ci.jpg

Das könnte Sie auch interessieren

Bleiben Sie informiert:

its-people hilft Ihnen...

Weitere Blogthemen: