创建活动集

当打开游标时,数据库服务器进行有必要的任何操作来定位选择了的数据的第一行。依赖于该查询的叙述方式,此活动可很容易,或者它可需要大量的工作和时间。请考虑下列游标的声明:
EXEC SQL DECLARE easy CURSOR FOR
          SELECT fname, lname FROM customer
          WHERE state = 'NJ'
由于在简单的方式中此游标仅需要单个表,因此,数据库服务器快速地确定是否有任何行满足该查询,并标识第一行。第一行是该游标此次找到的唯一一行。该活动集中余下的行仍然未知。作为对比,请考虑下列游标的声明:
EXEC SQL DECLARE hard SCROLL CURSOR FOR
          SELECT C.customer_num, O.order_num, sum (items.total_price)
          FROM customer C, orders O, items I
          WHERE C.customer_num = O.customer_num
          AND O.order_num = I.order_num
          AND O.paid_date is null
          GROUP BY C.customer_num, O.order_num 

通过连接三个表并将输出行分组,生成此游标的活动集。优化器可能能够使用索引来以正确的顺序产生这些行,但通常情况下,ORDER BY 或 GROUP BY 子句的使用要求在可确定哪一行标识第一行之前,数据库服务器生成所有行,将它们复制到临时表并对该表排序。

在活动集全部生成并保存在临时表中的情况下,数据库服务器可花费相当多的时间来打开游标。接着,数据库服务器可以确切地告诉程序活动集包含多少行。然而,此信息不可用。一个原因是您永远不可确定优化器会使用哪种模式。如果优化器可避免排序和临时表,则它会这样做;但在查询中、在表的大小方面或在可用的索引方面的小更改都可更改优化器的方式。