Oracle - 对全局临时或不对全局临时

时间:2009-09-04 16:18:56

标签: sql oracle plsql

因此,假设我有几百万条记录要从中生成一些报告,而不是运行我的实时表报告,我创建了一个临时值,然后我可以创建索引并将其用于进一步的数据萃取。

我知道缓存表往往会更快/更快地看到数据存储在内存中,但我很想知道是否存在使用物理临时表优于全局临时表的情况以及为什么?在处理大量数据时,哪种情况比另一种更好?

5 个答案:

答案 0 :(得分:2)

Oracle中的全局临时表与SQL Server中的临时表不同。它们不会缓存在内存中,而是写入临时表空间。

如果您正在处理大量数据并将其保留一段合理的时间 - 这似乎可能需要构建其他索引 - 我认为您应该使用常规表。如果您的方案具有单个会话(可能是后台作业,使用数据),则更是如此。

答案 1 :(得分:1)

在考虑临时表之前,我使用了子查询因子。如果需要在各种函数或过程中重用,我将其转换为视图(可以根据返回的数据转换为物化视图)。

根据asktom

...temp table and global temp table are synonymous in Oracle. 

答案 2 :(得分:0)

对于报告,临时表有助于数据只能由创建它的会话看到,这意味着您不必担心任何并发问题。

使用非临时表,您需要向表中添加会话句柄/标识符,以便区分会话。

答案 3 :(得分:0)

Oracle中普通(堆)表和全局临时表之间的主要区别在于它们的可见性和易变性:

将行提交到普通表后,它们对其他会话可见,并保留直到删除。

全局临时表中的行永远不会对其他会话可见,并且在会话结束后不会保留。

因此,选择应主要取决于您的应用程序设计需求,而不仅仅是性能(不是说性能不重要)。

答案 4 :(得分:0)

Oracle临时表的内容仅在创建数据的会话中可见,并在会话结束时消失。因此,您必须复制每个报告的数据。

此报告是您正在进行一次性操作还是会定期运行报告?复制大量数据只是为了运行报告对我来说似乎不是一个好的解决方案。为什么不对原始数据运行报告?

如果您无法使用原始表格,您可以创建一个物化视图,以便在需要时提供最新数据。