索引的双向遍历

如果对一列创建索引时不指定 ASC 或 DESC 关键字,则缺省情况下值以升序顺序存储;但是数据库服务器的双向遍历能力让您对一列仅创建一个索引并将该索引用于查询;这些查询指定结果以排序列的升序还是降序来排序。

由于此能力,是否将单列索引创建为升序或者降序索引无关紧要。不管您为索引选择哪种存储顺序,数据库服务器在处理查询时可按照升序或降序顺序来遍历该索引。

然而,如果您在表上创建一个复合索引,可能需要 ASC 和 DESC 关键字。例如,如果您希望输入其 ORDER BY 子句按照多个列排序并且按照不同的顺序对每个列排序的 SELECT 语句,并且您希望对此查询使用一个索引,则需要创建一个与 ORDER BY 列对应的复合索引。例如,假设您希望输入以下查询:
SELECT stock_num, manu_code, description, unit_price
        FROM stock ORDER BY manu_code ASC, unit_price DESC;
此查询通过 manu_code 列的值升序排序,然后按照 unit_price 列的值降序排序。要对此查询使用索引,您需要发出一个与 ORDER BY 子句的需求相对应的 CREATE INDEX 语句。例如,您可输入以下两个语句之一来创建索引:
CREATE INDEX stock_idx1 ON stock
        (manu_code ASC, unit_price DESC);
        CREATE INDEX stock_idx2 ON stock
        (manu_code DESC, unit_price ASC);
为此查询使用的复合索引(stock_idx1stock_idx2)不能用于您使用 ORDER BY 子句为两列指定相同的排序方向的查询。例如,假设您希望输入以下查询:
SELECT stock_num, manu_code, description, unit_price
        FROM stock ORDER BY manu_code ASC, unit_price ASC;
        SELECT stock_num, manu_code, description, unit_price
        FROM stock ORDER BY manu_code DESC, unit_price DESC;
如果您希望使用复合索引来提高这些查询的性能,则需要输入以下 CREATE INDEX 语句之一。可使用两种已创建的索引之一(stock_idx3stock_idx4 )来提高先前的查询的性能。
CREATE INDEX stock_idx3 ON stock
        (manu_code ASC, unit_price ASC);
        CREATE INDEX stock_idx4 ON stock
        (manu_code DESC, unit_price DESC);

可在一列上创建不超过一个的升序索引和不超过一个的降序索引。由于数据库服务器的双向遍历能力,您仅需创建这些索引之一。同时创建与在 stock_num 列上的升序或者降序排序完全达到相同的结果。

在索引的表上执行 INSERT 或 DELETE 操作之后,索引项的数量在页里变化,表需要的索引页的数量可以取决于该索引是否指定升序或降序顺序。对于一些加载和 DML 操作,按降序排序的单个列或多列索引可能导致数据库服务器分配的索引页多于按升序排序的索引。