database - Oracle 10g 临时表

标签 database oracle database-design oracle10g temp-tables

我正在尝试将存储过程中使用的永久表转换为全局临时表。我查看了这些永久表的统计数据,有些表有数千万行数据,如果大小为千兆字节(最多 10 GB),则按顺序排列。

所以,

CREATE TABLE my_table (  
  column1 NUMBER,  
  column2 NUMBER,  
  etc...  
)  
TABLESPACE BIGTABLESPACE  
NOLOGGING  
NOCOMPRESS  
NOCACHE  
NOPARALLEL  
MONITORING;  

应该变成

CREATE GLOBAL TEMPORARY TABLE my_table (  
  column1 NUMBER,  
  column2 NUMBER,  
  etc..  
)  
ON COMMIT PRESERVE ROWS;  

我正在创建一个等效的全局临时表,其中的行应保留到每个现有永久表的 session 结束。此全局临时表将在过程中使用,而不是永久表。
(EXECUTE IMMEDIATE 'TRUNCATE ...' 在开始时,INSERT/*+ APPEND */INTO 在稍后的某个时间点)

所有永久表都已在大表空间 BIGTABLESPACE 中创建

Oracle 文档声明全局临时表将在用户的临时表空间中创建(我假设这是 TEMP)。这个问题是 TEMP 表空间很小,并且范围没有设置为增长到我需要它们在过程中增长的大小。

TEMP 表空间是在数据库创建期间创建的

create database "$oracle\_sid"  
   user sys identified by "$sys\_password"  
   user system identified by "$system\_password"  
   set default bigfile tablespace  
   controlfile   reuse  
   maxdatafiles  256  
   maxinstances  $maxinstances  
   maxlogfiles   16  
   maxlogmembers 3  
   maxloghistory 1600  
   noarchivelog  
   character set WE8MSWIN1252  
   national character set AL16UTF16  
   datafile  
      '$oracle\_home/oradata/$oracle\_sid/system01.dbf' size 512M  
   logfile  
      '$oracle\_home/oradata/$oracle\_sid/redo01.log' size 1G,  
      '$oracle\_home/oradata/$oracle\_sid/redo02.log' size 1G,  
      '$oracle\_home/oradata/$oracle\_sid/redo03.log' size 1G  
   sysaux datafile  
      '$oracle\_home/oradata/$oracle\_sid/sysaux01.dbf' size 256M  
   default temporary tablespace temp tempfile  
      '$oracle\_home/oradata/$oracle\_sid/temp01.dbf' size 5G  
   undo tablespace "UNDOTBS1" datafile  
      '$oracle\_home/oradata/$oracle\_sid/undotbs01.dbf' size 5G;  

永久表(我打算替换)最初是在表空间 BIGTABLESPACE 中创建的

-- 50G bigfile datafile size  
create bigfile tablespace "BIGTABLESPACE"  
datafile '$oracle\_home/oradata/$oracle\_sid/bts01.dbf' size 50G  
extent management local  
segment space management auto;  

永久表索引最初是在表空间 BIGTABLESPACE 中创建的

-- 20G bigfile datafile size  
create bigfile tablespace "BIGINDXSPACE"  
datafile '$oracle\_home/oradata/$oracle\_sid/btsindx01.dbf' size 20G  
extent management local  
segment space management auto;  
  • 用全局临时表替换这些永久表是否可行?
  • TEMP 表空间将在扩展 TEMP 表空间时遇到问题。有没有办法在表空间 BIGTABLESPACEBIGINDXSPACE 中创建全局临时表及其索引?
  • 如果不是,我怎样才能使 TEMP 表空间表现得像一个大文件表空间并实现索引/表分离?
  • 我可以创建两个 TEMP 大文件表空间,然后在一个表空间中创建索引,在另一个表空间中创建表吗?

我想使用全局临时表,但我在过程中处理的数据量似乎超出了全局临时表的预期设计。 有什么建议吗?

最佳答案

除了可能使 DBA 更愿意将相似的对象组合在一起之外,将数据和索引分离到单独的表空间中没有任何好处。长期以来,有一个神话认为分离索引和数据有利于提高性能——这是不正确的。

临时对象应该(而且必须)存储在临时表空间中。如果您想将这些大型临时表隔离到一个单独的表空间中,您可以增加 TEMP 表空间的大小或仅为将拥有这些对象的用户创建一个单独的临时表空间。您不能(也不想)将它们存储在永久表空间中。

不过,在架构上,我很好奇为什么在您的系统中需要临时表。如果您有将 10 GB 写入临时表的 session ,然后可能会再次读出这 10 GB 以便将数据写入其他地方,我倾向于怀疑是否有更有效的解决方案。在 Oracle 中甚至很少需要临时表——这在其他数据库中更为常见,在这些数据库中,读者可以阻止编写者在处理数据之前需要将数据从表中复制出来。 Oracle 没有此类限制。

关于database - Oracle 10g 临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875311/

相关文章:

mysql - 存储播放列表中视频的顺序

c# - 当我尝试连接到数据库时收到 "Error: Cannot initialize OLE"? C#

oracle - 如何通过连接同一表中的其他两列来更新列

java - 在终端中使用 JDBC 将 Java 连接到 Oracle 数据库

sql - 在 Oracle 存储过程中运行查询

database - 如何在数据库中实现父类(super class)、子类关系?

database - SQLite 中的三向全外连接

php - 是否有任何 PHP 框架(例如 CodeIgniter)支持基于每个用户帐户的数据库连接以用于 Multi-Tenancy 数据库?

database - 创建高流量临时数据库的最佳方法是内存中还是 SQL?

php - 多答案枚举的 SQL DB 设计