排序优化
本节将介绍 Db2 for i 如何实现排序技术,以及查询优化器如何做出优化选择。 查询优化器可以使用索引排序或排序来实现排序。
排序顺序实现
排序算法将行读取到排序空间中,并根据指定的排序键对行进行排序。 然后,将行从有序排序空间返回给用户。
索引排序实现
索引排序实现需要一个包含所有排序列作为相邻最左侧键列的索引。 数据库管理器按索引顺序通过索引访问各个行,这将导致将行返回给请求者。
如果应用程序不需要检索所有已排序的结果,或者存在与排序列相匹配的索引,那么此实现可能是有益的。 当使用索引实现排序时,如果不存在满足排序列的永久索引,那么将创建临时索引。 查询中指定的排序列将用作此索引的键列。
索引合并排序实现
"索引合并排序" 通过使用索引来应用选择,然后使用已建立索引的列表对行进行排序,从而获取索引和排序的部分功能。 此优化主要针对优化目标为 *FIRSTIO 且 WHERE 子句选择包含不相等谓词的查询。
通过消除排序列来优化排序
将对所有排序列进行求值,以确定是否可以从排序列列表中除去这些列。 只能考虑那些具有指定了相等运算符的可隔离选择谓词的定序列。 这将保证该列只能与单个值匹配,并且无法帮助确定顺序。
通常,要使索引符合 "索引合并排序" 的条件,应按如下所示创建索引:
- 没有在 ORDER BY 列表中的任何具有相等谓词的列都应该是索引中的第一个键。
- 后跟不在 ORDER BY 列表中的不相等谓词的任何列。 应该对这些列进行排列,以便最有选择性的谓词列是等谓词列之后的第一列。
- 后跟 ORDER BY 列,顺序与查询的 ORDER BY 子句相同,并且具有相同的 ASC 或 DESC 属性。
- (可选) 在结束时,可以包含其他选择列或其他选择列以用于 "仅索引访问"。
例如:
SELECT * FROM SALES
WHERE SALES_DATE BETWEEN '1996-03-29' AND '1996-04-29'
AND REGION IN ('Quebec','Manitoba')
ORDER BY SALES_PERSON要创建的索引将包含键:
SALES_DATE, REGION, SALES_PERSON 为了允许更一般的索引方案,即使在查询中没有使用前导键,也可以使用索引进行索引合并排序。 上述索引还可用于以下查询:
SELECT SALES_DATE, REGION, SALES_PERSON, SALES
FROM SALES
WHERE REGION IN ('Quebec','Manitoba')
ORDER BY SALES_PERSON如果将 SALES 添加为尾部键,那么 "仅索引访问" 将用于这两个查询。
CREATE INDEX SALES_IMOX ON SALES (SALES_DATE, REGION, SALES_PERSON, SALES)现在,优化器在实现查询时可以考虑更多索引。 作为键列添加到临时索引的列数也会减少。 以下 SQL 示例说明了一个查询,在该查询中,优化器可能会消除排序列。
DECLARE DEPTEMP CURSOR FOR
SELECT EMPNO, LASTNAME, WORKDEPT
FROM CORPDATA.EMPLOYEE
WHERE EMPNO = '000190'
ORDER BY EMPNO, LASTNAME, WORKDEPT通过添加其他排序列来优化排序
应用于除去排序列的逻辑也可用于向查询添加其他分组列。 仅当您尝试确定是否可以使用索引来实现排序时,才会执行此逻辑。
以下示例说明了优化器可以在其中添加其他排序列的查询。
CREATE INDEX X1 ON EMPLOYEE (LASTNAME, EMPNO, WORKDEPT)
DECLARE DEPTEMP CURSOR FOR
SELECT LASTNAME, WORKDEPT
FROM CORPDATA.EMPLOYEE
WHERE EMPNO = '000190'
ORDER BY LASTNAME, WORKDEPT对于此查询请求,优化器可以在考虑查询的 X1 时添加 EMPNO 作为附加排序列。
使用反向排序索引的索引排序实现
还可以使用反向有序索引来提供排序。 在这种情况下,必须反转所有 ORDER BY 列的索引键。 数据库管理器将以相反的顺序处理索引,方法是从末尾开始并向后读取索引。
以下索引和查询说明了优化器可以使用反向有序索引的示例。
CREATE INDEX CORPDATA.INDEX1 ON CORPDATA.EMPLOYEE (SALARY ASC, LASTNAME DESC)SELECT EMPNO, LASTNAME, WORKDEPT, SALARY
FROM CORPDATA.EMPLOYEE
ORDER BY SALARY DESC, LASTNAME ASC