Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 监控和提高数据库性能 » 提高数据库性能 » 性能提高提示

 

在查询处理中使用工作表(使用 All-rows 优化目标)

工作表是实例化的临时结果集,这些临时结果集在执行查询的过程中创建。当 SQL Anywhere 确定使用工作表所需的开销少于其它策略时,就会使用工作表。通常,读取前几行所需的时间在使用工作表时要多一些,但是在某些情况下,如果可以使用工作表,检索所有行所需的开销则可能会大大降低。由于存在这种差异,SQL Anywhere 会根据 optimization_goal 设置选择不同的策略。缺省值是前几行 (first-row)。如果该值设置为 first-row,SQL Anywhere 将尝试避免使用工作表。如果该值设置为 All-rows,SQL Anywhere 将在工作表能够减少查询的总执行开销时使用工作表。

有关 optimization_goal 设置的详细信息,请参见optimization_goal 选项 [数据库]

在以下情况中将使用工作表:

  • 当查询包含 ORDER BY、GROUP BY 或 DISTINCT 子句,并且 SQL Anywhere 不使用索引对行进行排序时。如果存在适当的索引且 optimization_goal 设置是 First-row 时,SQL Anywhere 将避免使用工作表。但是,当 optimization_goal 设置为 All-rows 时,使用索引读取查询的所有行可能会比建立工作表并将行排序开销更大。如果优化目标设置为 All-rows,SQL Anywhere 会选择开销较低的策略。对于 GROUP BY 和 DISTINCT,基于散列的算法将使用工作表,但通常在读取查询中的所有行时更为有效。

  • 选择了散列连接算法时。在这种情况下,将使用多个工作表来存储中间结果(如果内存不够存放),并使用一个工作表来存储连接的结果。

  • 当用敏感值打开游标时。在这种情况下,将创建一个工作表来保存基表的行标识符和主键。当向前从查询中读取行时,将填充该工作表。但是,如果从游标中读取最后一行,则将填充整个表。

  • 当用不敏感的语义打开游标时。在这种情况下,将在查询打开时用查询结果填充工作表。

  • 当多行 UPDATE 操作正在执行,并且所更新的列出现在 Update 命令的 WHERE 子句中,或出现在用于 Update 操作的索引中时

  • 当多行 UPDATE 或 DELETE 操作在 WHERE 子句中有一个引用所修改的表的子查询时

  • 当从 SELECT 语句中执行 INSERT,并且该 SELECT 语句引用插入表时

  • 当执行多行 INSERT、UPDATE 或 DELETE 操作,并且在表中定义可能在操作过程中触发的相应触发器时

在这些情况下,操作所影响的记录会进入工作表。在某些情况(如键集决定的游标)下,将在工作表上建立临时索引。在查询结果出现之前,将所需记录提取到工作表中的操作可能会需要大量的时间。通过创建可用来在上述第一种情况下执行排序的索引,可以减少检索前几行所需的时间。但是,如果使用工作表,则可以减少读取所有行所需的时间,因为它支持基于散列和合并排序的查询算法。这些算法采用顺序 I/O,这比用于索引扫描的随机 I/O 要快一些。

优化程序将分析每个查询,以确定工作表是否能够提供最佳性能。用户无需执行任何操作即可利用这些优化。

注意

上述的 INSERT、UPDATE 和 DELETE 情况通常不会有性能问题,因为它们通常是一次性操作。但是,如果出现问题,您可能还能够改写该命令以避免冲突并避免建立工作表。这并不总是可能的。