5.5 支持迭代开发
迭代开发方法学通常由一系列快速开发原型组成。这些原型用于在开发系统时定义系统需求。这些方法学非常吸引人,因为它们能在开发期间向客户显示一些具有实际意义的内容。然而,在迭代开发过程中有一些常见的陷阱会破坏它的有效性。
首先,没有始终坚持使用有效的版本化。创建应用程序的多个版本可以允许在改变其他特性时“冻结”某些特性。它也允许应用程序的某些部分处于开发过程中,而其他部分处于测试过程中。最常见的情况是,应用程序的一种版本用于每个特性的每次迭代,从而导致最终的产品不够灵活,无法处理变更需求(这是迭代开发所宣称的目标)。
其次,并不总是抛弃原型。开发原型是为了让客户了解最终产品的大致外观,而不应该将它们作为最终产品的基础。使用它们作为基础将不会产生最稳定和最灵活的系统。执行迭代开发时,应将原型视为临时的遗留系统。
第三,开发、测试和生产各环境的划分并不明确。迭代开发的方法学必须非常清晰地定义在应用程序版本可以进入到下一个阶段前必须满足的条件。最好保持原型开发与完整应用程序的开发完全分离。
最后,经常设置不切实际的时间线。应用于结构化方法的可交付成果同样也适用于迭代式方法。应用程序的加速开发并不意味着可以更快地生成可交付成果。
5.5.1 迭代式列定义
在开发过程期间,列定义可频繁改变。可从已有表中删除列,也可立刻删除列,或者将其标记为“未使用”,以便以后再删除它。如果立刻删除列,这种动作可能会影响性能。而如果将列标记为“未使用”,对性能没有任何影响。可在以后较少使用数据库时再真正删除该列。
要删除列,可使用ALTER TABLE命令的SET UNUSED子句或DROP子句,但不可删除伪列、嵌套表的列或分区键列。
在下面的示例中,从名为TABLE1的表中删除列COL2:
alter table table1 drop column col2;
可以将一列标记为未使用,如下所示:
alter table table1 set unused column col3;
注意:
从Oracle Database 12c开始,可使用SET UNUSED COLUMN . . . ONLINE避免表上的块锁,从而增强可用性。
将一列标记为UNUSED(未使用)不会释放该列以前使用的空间。也可删除任何未使用的列:
alter table table1 drop unused columns;
可查询USER_UNUSED_COL_TABS、DBA_UNUSED_COL和ALL_UNUSED_COL_ TABS,查看具有标记UNUSED的列的所有表。
注意:
一旦将一列标记为UNUSED,则不可以访问该列。如果在指定一列为未使用后导出表,则不会导出该列。
可在一条命令中删除多列,如下面的示例所示:
alter table table1 drop (col4, col5);
注意:
删除多个列时,不应该在ALTER TABLE命令中使用COLUMN关键字。多个列名必须用圆括号括起来,如同前面的示例所示。
如果删除的列是主键或唯一性约束的一部分,则需要把CASCADE CONSTRAINTS子句作为ALTER TABLE命令的一部分。如果删除属于主键的列,则Oracle将删除此列和主键索引。
如果在可以删除列期间没有立刻安排维护周期,则将这些列标记为UNUSED。在后面的维护周期,可通过SYS和SYSTEM账户完成维护。
5.5.2 强制光标共享
理想情况下,应用程序开发人员应在程序中使用绑定变量,从而尽可能重用共享SQL区域中以前已解析的命令。如果没有使用绑定变量,可能会在库缓存中看到许多非常类似的语句——只在WHERE子句的字面值上存在区别的查询。
只有字面值组成部分不同,其他部分相同的语句称为“类似语句”。如果将CURSOR_SHARING初始参数设置为FORCE,类似语句就可以重用共享SQL区域中以前已解析的命令。如果SQL语句必须精确匹配(包括所有字面值),则使用EXACT(默认值)。
注意:
从Oracle Database 12c开始,不建议使用CURSOR_SHARING的SIMILAR值,应改用FORCE。