工作表是已实现的临时结果集,这些临时结果集在执行查询的过程中创建。当 Adaptive Server Anywhere 确定使用工作表所需的成本少于其他策略时,就会使用工作表。通常,读取前几行所需的时间在使用工作表时要多一些,但是在某些情况下,如果可以使用工作表,检索所有行所需的成本则可能会大大降低。由于存在这种差异,Adaptive Server Anywhere 会根据 OPTIMIZATION_GOAL 设置选择不同的策略。缺省值是前几行 (first-row)。如果该值设置为前几行,Adaptive Server Anywhere 将尝试避免使用工作表。如果该值设置为所有行 (all-rows),Adaptive Server Anywhere 将在工作表会减少查询的总执行成本时使用工作表。
在以下情况中将使用工作表:
当查询包含 ORDER BY、GROUP BY 或 DISTINCT 子句,并且 Adaptive Server Anywhere 不使用索引来进行行排序时。如果存在适当的索引而且 OPTIMIZATION_GOAL 设置是前几行,Adaptive Server Anywhere 将避免使用工作表。但是,当 OPTIMIZATION_GOAL 设置为所有行时,使用索引读取查询的所有行可能会比建立工作表并将行排序更为耗费成本。如果优化目标设置为所有行,Adaptive Server Anywhere 会选择成本较低的策略。对于 GROUP BY 和 DISTINCT,基于散列的算法将使用工作表,但通常在读取查询中的所有行时更为有效。
当选择散列连接算法时,将使用多个工作表来存储中间结果(如果内存不够存放)并使用一个工作表来存储连接的结果。
当用值敏感打开游标时,将创建一个工作表来保存基表的行标识符和主键。当向前从查询中读取行时,将填充该工作表。但是,如果从游标中读取最后一行,则将填充整个表。
当用不敏感的语义打开游标时,将在查询打开时用查询结果填充工作表。
当多行 UPDATE 操作正在执行,并且所更新的列出现在 Update 命令的 WHERE 子句或用于 Update 操作的索引中时。
当多行 UPDATE 或 DELETE 操作在 WHERE 子句中有一个引用所修改的表的子查询时。
当从 SELECT 语句中执行 INSERT,并且该 SELECT 语句引用插入表时。
当执行多行 INSERT、UPDATE 或 DELETE 操作,并且定义相关触发器的表可能在操作过程中触发时。
在这些情况下,操作所影响的记录会进入工作表。在某些情况(如键集驱动的游标)下,将在工作表上建立临时索引。在查询结果出现之前,将所需记录提取到工作表中的操作可能会需要大量的时间。通过创建可用来在上述第一种情况下执行排序的索引,可以减少检索前几行所需的时间。但是,如果使用工作表,则可以减少读取所有行所需的时间,因为它支持基于散列和合并排序的查询算法。这些算法采用顺序 I/O,这比用于索引扫描的随机 I/O 要快一些。
数据库服务器中的查询优化程序将分析每个查询,以确定工作表是否将提供最佳性能。Adaptive Server Anywhere 的新版本中对优化程序的改进可能会改善查询的访问计划。用户无需执行任何操作即可利用这些优化。
上述的 INSERT、UPDATE 和 DELETE 情况通常不会有性能问题,因为它们通常是一次性操作。但是,如果出现问题,您可能还能够改写该命令以避免冲突并避免建立工作表。这并不总是可能的。
SQL Anywhere Studio 9.0.2
版权所有 © 1989–2005 Sybase, Inc. 部分版权所有 © 2001–2005 iAnywhere Solutions, Inc. 保留所有权利。