2012-01-30 35 views
6

在Oracle中有没有办法创建一个仅在数据库运行时存在且仅存储在内存中的表?所以如果数据库重新启动,我将不得不重新创建表?在Oracle中,您是否可以创建仅在数据库运行时才存在的表?

编辑: 我想要的数据存在于会话。原因是这些数据的重建成本很高,但也非常敏感。

与现在发生的情况相比,使用临时表可能会提高性能,但它仍然不是一个好的解决方案。

+0

据我所知,Oracle中的临时表是持久的;只有他们的数据是易变的。这对你来说会是一个问题吗? – 2012-01-30 15:58:29

+0

这是我的问题,我希望数据在数据库启动时保持不变,因为重新创建数据的代价很高。 – chotchki 2012-01-30 16:01:57

+0

你有什么打算?您想做什么? – 2012-01-30 16:02:58

回答

3

您可以使用Oracle的触发机制,当数据库启动或关闭时调用存储过程。

这样你就可以让启动触发器创建表,并且关闭触发器将其删除。

您可能还希望启动触发器处理表存在的情况并截断它,以防止服务器突然停止并且关闭触发器未被调用。

Oracle trigger documentation

+0

我喜欢这种方法,并且有一个未记录的表。我也可以使用上面的buffer_pool。 – chotchki 2012-02-01 20:54:42

4

您可以创建一个100%的临时表是会话(通常比持续时间比数据库运行时间短)的持续时间可称为临时表。记忆中一张桌子的整个目的是为了让阅读速度更快。您必须为每个会话重新填充表格,因为一旦会话完成,表格将被遗忘(包括结构和数据)。

2

使用Oracle的Global Temporary Tables,您可以在内存中创建一个表,并把它在事务,或在会议结束的最后删除数据。

4

没有,完全没有。 Oracle有一个“全局临时表”的概念。使用全局临时表,您可以像创建其他表一样创建表。表格定义将永久保存,与其他表格一样。

但是,表格的内容不会是永久性的。根据您的定义,内容将在会话的生命周期(提交perserve行)或事务的生命周期(提交删除行)上持续存在。

参见所有细节的文档: http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables003.htm#ADMIN11633

希望有所帮助。

2

如果我理解正确的话,你必须在数据库联机并留下可用的,只要仅在数据库联机要处理,需要一些数据。我能想到的唯一用例就是如果你正在加密一些数据,并且你想确保未加密的数据永远不会写入磁盘。

如果这实际上是您的用例,我会建议您忘记尝试为此创建自己的解决方案,而是使用Oracle的encrypted tablespacesTransparent Data Encryption

+0

不要笑,但Oracle的加密表空间和TDE都被认为是我工作环境的安全风险。那不幸在我的控制之外,我已经失去了使用它们的战斗。 – chotchki 2012-01-31 13:58:36

相关问题