【发布时间】:2009-09-04 16:18:56
【问题描述】:
假设我有几百万条记录要从中提取以生成一些报告,而不是运行我的实时表报告,我创建一个临时表,然后我可以在其中创建索引并将其用于进一步的数据萃取。
我知道缓存表往往更快/更快,因为数据存储在内存中,但我很想知道是否存在使用物理临时表比全局临时表更好的情况,为什么?在处理大量数据时,哪种情况会比另一种更好?
【问题讨论】:
假设我有几百万条记录要从中提取以生成一些报告,而不是运行我的实时表报告,我创建一个临时表,然后我可以在其中创建索引并将其用于进一步的数据萃取。
我知道缓存表往往更快/更快,因为数据存储在内存中,但我很想知道是否存在使用物理临时表比全局临时表更好的情况,为什么?在处理大量数据时,哪种情况会比另一种更好?
【问题讨论】:
Oracle 中的全局临时表与 SQL Server 中的临时表不同。它们没有缓存在内存中,它们被写入临时表空间。
如果您要处理大量数据并将其保留一段合理的时间(这似乎是因为您想构建额外的索引),我认为您应该使用常规表。如果您的方案只有一个会话(可能是后台作业)处理数据,情况就更是如此。
【讨论】:
在考虑临时表之前,我会使用子查询分解。如果需要在各种函数或过程中重用,我将其转换为视图(根据返回的数据可以转换为物化视图)。
根据asktom:
...temp table and global temp table are synonymous in Oracle.
【讨论】:
对于报告,临时表很有帮助,因为只有创建它的会话才能看到数据,这意味着您不必担心任何并发问题。
对于非临时表,您需要向表中添加会话句柄/标识符以区分会话。
【讨论】:
Oracle 中普通(堆)表和全局临时表的主要区别在于它们的可见性和易变性:
一旦将行提交到普通表,它们对其他会话可见并保留到删除为止。
全局临时表中的行对其他会话永远不可见,并且在会话结束后不会保留。
所以选择应该主要取决于您的应用程序设计需要什么,而不仅仅是性能(并不是说性能不重要)。
【讨论】:
Oracle 临时表的内容仅在创建数据的会话中可见,并在会话结束时消失。因此,您必须为每个报告复制数据。
此报告是您进行一次性操作还是会定期运行?复制大量数据只是为了运行报告对我来说似乎不是一个好的解决方案。为什么不对原始数据运行报告?
如果您不能使用原始表格,您可以创建一个计量化视图,以便在需要时提供最新数据。
【讨论】: