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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Datenbanken erstellen » Mit Datenbankobjekten arbeiten

 

Mit berechneten Spalten arbeiten

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. Eine Liste der Spezialwerte, die eine Übereinstimmung verhindern, finden Sie unter Spezialwerte.

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. Weitere Hinweise finden Sie unter Prädikate in Abfragen verwenden. 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 gültigem 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.


Berechnete Spaltenausdrücke ändern
Berechnete Spalten einfügen und aktualisieren
Berechnete Spalten neu berechnen
Tabellen oder Spalten innerhalb oder zwischen Datenbanken kopieren