我最近使用Teradata分配了一个项目。 我被告知严格使用DROP + CREATE而不是DELETE ALL,因为后者"留下了一些分配的空间"。这对我来说是违反直觉的,我认为这可能是错误的。我在网上搜索了两种方法之间的比较,但我一无所获。 这只会加强我的信念,即DELETE ALL不会受到上述问题的影响。 但是,如果是这种情况,我必须证明(实际和理论上)。
所以,我的问题是:两种方法之间的空间分配是否存在差异?如果没有,是否有证明它的官方文件(用户指南,技术规范,其他)?
谢谢!
答案 0 :(得分:3)
这里有一个讨论:http://teradataforum.com/teradata/20120403_105705.htm关于同一个主题(虽然它没有真正回答"留下一些空间分配到#34;部分)。他们实际上推荐DELETE ALL
,但出于其他(性能)原因:
我引用以防链接失效:
"删除所有"会更快,虽然实际上它们的表现往往没有太大差异。
但是,特别是对于定期运行的流程(比如每日批处理流程),我推荐"删除所有"做法。这将减少工作量,因为它只删除数据并保留定义。请记住,如果删除定义,则需要访问多个字典表,当然,在重新创建对象时,您必须(通常)访问这些表。
除了性能方面,drop / create方法的缺点是每次创建对象时Teradata都会插入"默认行"即使通过角色安全性和/或数据库级安全性来控制对对象的后续访问,也要进入AccessRights表。您可能知道AccessRights表很容易变得很大且非常偏斜。根据我的经验,许多站点都有一个定期清理此表的过程,删除多余的行。如果您的(通常是批处理)进程定期删除/创建对象,那么您只需在表中添加先前已被清理进程删除的行,并且将来将通过相同的进程将其删除。这听起来完全是浪费时间给我。
答案 1 :(得分:2)
您的印象是正确的,您没有找到任何引用" DELETE留下一些空间分配"在任何地方,因为它完全错误:-)
DELETE ALL类似于其他DBMS中的TRUNCATE,在大多数情况下使用fastpath处理:
答案 2 :(得分:0)
首先,您无法在Teradata中的一个事务中执行DROP / CREATE(在Oracle中,日常DDL还有其他问题),因此当ETL流程变得复杂时,您可能最终会依赖于此,而更重要的业务流程所依赖的则更少。重要(就像您可能会看到 customers表为空 或者您在一个较小的列中超出了varchar值)
我的观点:使用事务和模块化编程。在Teradata中,这意味着尽可能避免DDL,并使用DELETE / UPDATE / MERGE / INSERT而不是DROP / CREATE。
在Postgres中,DDL语句是事务性的。