Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Tabellen, Ansichten und Indizes

 

Berechnete Spalten

Eine berechnete Spalte ist eine Spalte, deren Wert ein Ausdruck ist, der die Werte von anderen Spalten, die als abhängige Spalten bezeichnet werden, in derselben Zeile referenzieren kann. Berechnete Spalten sind vor allem dann nützlich, wenn Sie einen Index für einen komplexen Ausdruck bilden wollen, der möglicherweise die Werte von einer oder mehreren abhängigen Spalten umfasst. Der Datenbankserver verwendet die berechnete Spalte immer dann, wenn er einen Ausdruck erkennt, der mit dem COMPUTE-Ausdruck der berechneten Spalte übereinstimmt. Dies gilt sowohl für die SELECT-Liste als auch für Prädikate. Wenn der Abfrageausdruck jedoch einen Spezialwert wie etwa CURRENT TIMESTAMP enthält, tritt diese Übereinstimmung nicht auf.

Verwenden Sie für berechnete Spalten keine TIMESTAMP WITH TIME ZONE-Spalten. Der Wert der time_zone_adjustment-Option variiert zwischen Verbindungen, abhängig von ihrem Standort und der Jahreszeit. Dies führt zu falschen Ergebnissen und unerwartetem Verhalten, wenn die Werte berechnet werden.

Während der Abfrageoptimierung versucht der SQL Anywhere-Optimierer automatisch, ein Prädikat, das einen komplexen Ausdruck betrifft, in eines umzuwandeln, das sich einfach auf die Definition der berechneten Spalte bezieht. Nehmen wir z.B. an, dass Sie eine Tabelle abfragen wollen, die Zusammenfassungsinformationen über Produktlieferungen enthält:

CREATE TABLE Shipments(
   ShipmentID INTEGER NOT NULL PRIMARY KEY,
   ShipmentDate TIMESTAMP,
   ProductCode CHAR(20) NOT NULL,
   Quantity INTEGER NOT NULL,
   TotalPrice DECIMAL(10,2) NOT NULL
);

Im Einzelnen sollte die Abfrage jene Lieferungen zurückgeben, deren Durchschnittskosten zwischen zwei und vier Dollar liegen. Die Abfrage könne folgendermaßen aussehen:

SELECT *
   FROM Shipments
   WHERE ( TotalPrice / Quantity ) BETWEEN 2.00 AND 4.00;

In der obenstehenden Abfrage ist das Prädikat in der WHERE-Klausel jedoch nicht "sargable" (als Suchargument nutzbar), da es nicht eine einzelne Basisspalte referenziert.

Wenn die Tabelle "Shipments" relativ groß ist, ist möglicherweise ein Abruf mit Index günstiger als ein sequenzielles Durchsuchen. Um einen indizierten Abruf zu nutzen, erstellen Sie eine berechnete Spalte namens "AverageCost" für die Tabelle "Shipments" und dann einen Index für die Spalte:

ALTER TABLE Shipments
   ADD AverageCost DECIMAL(21,13)
   COMPUTE( TotalPrice / Quantity );
 CREATE INDEX IDX_average_cost
   ON Shipments( AverageCost ASC );

Die Auswahl des Typs für die berechnete Spalte ist wichtig, denn der SQL Anywhere-Optimierer ersetzt nur dann komplexe Ausdrücke durch eine berechnete Spalte, wenn der Datentyp des Ausdrucks in der Abfrage genau dem Datentyp der berechneten Spalte entspricht. Um den Typ eines Ausdrucks festzustellen, können Sie die integrierte EXPRTYPE-Funktion verwenden, die den Typ des Ausdrucks in SQL-Format zurückgibt:

SELECT EXPRTYPE(
 'SELECT ( TotalPrice/Quantity ) AS X FROM Shipments', 1 )
   FROM DUMMY;

Für die Tabelle "Shipments" gibt die vorherige Abfrage decimal(21,13) zurück. Während der Optimierung schreibt der SQL Anywhere-Optimierer die vorige Abfrage folgendermaßen um:

SELECT *
   FROM Shipments
   WHERE AverageCost
   BETWEEN 2.00 AND 4.00;

In diesem Fall ist das Prädikat in der WHERE-Klausel nun sargable. Dadurch erhält der Optimierer die Möglichkeit, eine indizierte Suche zu verwenden, in dem der neue Index "IDX_average_cost" für den Zugriffsplan der Abfrage benutzt wird.

 Siehe auch

Berechnete Spalten ändern
Einfügungen in und Aktualisierungen von berechneten Spalten
Neuberechnung von berechneten Spalten