计算列是一个以可引用同一行中其它列(称为相关列)值的表达式作为值的列。如果要为一个复杂的表达式创建索引而该表达式可能包含一个或多个相关列的值,计算列就特别有用。数据库服务器在发现某个表达式与计算列的 COMPUTE 表达式相匹配时,即会使用计算列;这包括 SELECT 列表及谓语。但是,如果查询表达式包含某个特殊值(如 CURRENT TIMESTAMP),这一匹配则不会发生。
请勿将 TIMESTAMP WITH TIME ZONE 列用作计算列。由于 time_zone_adjustment 选项在两个位置和年份时间不同的连接之间值也会不同,因此对值进行计算时会生成错误的结果和意外的行为。
在查询优化过程中,SQL Anywhere 优化程序会自动尝试将涉及复杂表达式的谓语转换为只引用计算列定义的谓语。例如,假定您要查询包含有关产品发货汇总信息的表:
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 ); |
具体地说,查询要返回平均成本介于两美元和四美元之间的发货。可按如下方法编写这一查询:
SELECT * FROM Shipments WHERE ( TotalPrice / Quantity ) BETWEEN 2.00 AND 4.00; |
但是,在上述查询中,WHERE 子句中的谓语是不可优化搜索的,因为它不引用单个基列。
如果 Shipments 表相对较大,可能更适合采用索引检索而不是顺序扫描。要从索引检索获益,为 Shipments 表创建名为 AverageCost 的计算列,然后在该列上创建索引,如下所示:
ALTER TABLE Shipments ADD AverageCost DECIMAL(21,13) COMPUTE( TotalPrice / Quantity ); CREATE INDEX IDX_average_cost ON Shipments( AverageCost ASC ); |
选择计算列的类型是很重要的;只有在查询中的表达式数据类型与计算列的数据类型完全匹配时,SQL Anywhere 优化程序才会将复杂的表达式替换为计算列。要确定表达式的类型,可以使用内置函数 EXPRTYPE,它会以现成的 SQL 术语返回表达式的类型:
SELECT EXPRTYPE( 'SELECT ( TotalPrice/Quantity ) AS X FROM Shipments', 1 ) FROM DUMMY; |
对于 Shipments 表,上述查询会返回 decimal(21,13)。在优化过程中,SQL Anywhere 优化程序按如下所示重写上述查询:
SELECT * FROM Shipments WHERE AverageCost BETWEEN 2.00 AND 4.00; |
在此例中,WHERE 子句中的谓语现在是可优化搜索的,使优化程序能使用新的 IDX_average_cost 索引为该查询的访问计划选择索引扫描。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |