Oracle文档指出,本地管理的表空间在几个方面优于字典管理的表空间.一个是当数据库在字典管理的表空间中分配空闲块时使用递归sql.表fet $有列(TS#,FILE#,BLOCK#,LENGTH)
任何人都可以解释为什么递归sql用于分配fet $?
你似乎在正常的编程意义上解释'递归'; 但它的含义可能略有不同:
借鉴,回顾.互相借用的故事
的递归本质(数学,不具有可比性)表达式,其中每个术语通过将公式应用于前面的术语来确定
(计算,无法比较)调用自身的程序或函数
...
如果你把它解释为一个递归函数(意思是3)那么它就没那么有意义了; fet$
不会重复更新,并且SQL语句不会重新执行.这里'recursive'被更普遍地使用(意思是1,类似于),从某种意义上说,你运行的SQL会在引擎盖下生成另一层SQL.不同的SQL或相同的函数本身调用,但"SQL绘制在SQL上",或"SQL引用回SQL",如果你愿意.
该理念指导 -这是我认为你从了你的问题-说:
避免使用数据字典来管理范围
如果消耗或释放范围中的空间导致另一个消耗或释放数据字典表或撤消段中的空间的操作,则在字典管理的表空间中可能发生递归操作.
使用字典托管表空间(DMT)中的表,当您插入数据时,Oracle必须针对字典表运行SQL语句以识别和分配块.您通常不会注意到这一点,但您可以在跟踪文件和其他性能视图中看到它.将运行SQL语句fet$
来管理空间等.
'递归'部分是一个SQL语句必须执行另一个(不同的)SQL语句; 而这又可能必须执行另一个(不同的)SQL语句.
使用本地管理的表空间(LMT),块信息保存在表空间本身的位图中.不依赖于字典(无论如何).不需要额外的SQL层,这可以节省时间 - 包括字典查询本身和潜在的并发延迟,因为多个查询(跨数据库,对于所有表空间)同时访问字典.管理该本地块更简单,更快捷.
概念指南还说:
注意: Oracle强烈建议使用具有自动段空间管理的本地管理表空间.
正如David所说,使用字典管理的表空间不再有任何好处,除非你继承了仍然使用它们的旧数据库 - 在这种情况下应该考虑迁移到LMT - 或者只是为了学习而学习它,你几乎可以忘记它们; 任何新东西都应该真正使用LMT,并且对DMT的引用有望具有历史意义.
我想通过在insert
针对LMT和DMT 的相同语句上运行跟踪来演示差异,并在DMT版本中显示跟踪文件中的额外SQL语句; 但我无法在任何我可以访问的数据库上找到DMT,回到9i,我认为这样可以支持David的观点.相反,我会指出更多文档:
有时,要执行用户发出的SQL语句,Oracle数据库必须发出其他语句.这些语句称为递归调用或递归SQL语句.例如,如果将一行插入到没有足够空间容纳该行的表中,则Oracle数据库会进行递归调用以动态分配空间.当数据字典信息在数据字典高速缓存中不可用时,也会生成递归调用,并且必须从磁盘检索.
如果您有权访问DMT,您可以使用该文档中描述的跟踪工具进行自我比较; 或者你可以搜索例子.
您可以看到其他地方引用的递归SQL,通常是错误 ; 错误不是直接在您正在执行的SQL中,而是在内部的额外SQL Oracle问题中,以便满足您的请求.LMT只删除过去曾经需要的一个实例,并且在此过程中可以消除重大瓶颈.