使用临时表减小排序范围

可以使用表的临时、排序子集提高查询速度。临时表还可以简化查询优化器的工作,使优化器避免多次排序操作,并以其他方式简化优化器的工作。

例如:假设应用程序针对具有未付余额的客户生成了一系列报告,每个主要邮政区域生成一份报告,按客户名称排序。 换言之,发生了一系列查询,每个查询均采用了以下形式(使用假设的表和列名):
SELECT cust.name, rcvbles.balance, ...other columns...
      FROM cust, rcvbles
      WHERE cust.customer_id = rcvbles.customer_id
            AND rcvbls.balance > 0
            AND cust.postcode LIKE '98_ _ _'
      ORDER BY cust.name

该查询读取整个 cust 表。 对于具有指定邮政编码的每一行,数据库服务器搜索对 rcvbles.customer_id 的索引,并执行非顺序磁盘存取,以找到所有匹配行。 然后将这些行写到临时文件并进行排序。 有关临时文件的更多信息,请参阅为临时表和排序文件配置数据库空间

如果查询只执行一次,此过程是可以接受的,但该示例中包含一系列查询,每个查询都产生同样的工作量。

备选方案是,选择所有具有未付余额的客户,将他们放入一个临时表,在表中以客户名称排序,如以下示例所示:
SELECT cust.name, rcvbles.balance, ...other columns...
      FROM cust, rcvbles
      WHERE cust.customer_id = rcvbles.customer_id
            AND cvbls.balance > 0
      INTO TEMP cust_with_balance
然后可以对该临时表执行查询,如以下示例所示:
SELECT *
      FROM cust_with_balance
      WHERE postcode LIKE '98_ _ _'
      ORDER BY cust.name

每个查询顺序读取临时表,但该表的行数比主表少。