我正在尝试将存储过程中使用的永久表转换为全局临时表。我查看了这些永久表的统计数据,有些表有数千万行数据,如果大小为千兆字节(最多 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 表空间时遇到问题。有没有办法在表空间
BIGTABLESPACE
和BIGINDXSPACE
中创建全局临时表及其索引? - 如果不是,我怎样才能使
TEMP
表空间表现得像一个大文件表空间并实现索引/表分离? - 我可以创建两个
TEMP
大文件表空间,然后在一个表空间中创建索引,在另一个表空间中创建表吗?
我想使用全局临时表,但我在过程中处理的数据量似乎超出了全局临时表的预期设计。 有什么建议吗?
最佳答案
除了可能使 DBA 更愿意将相似的对象组合在一起之外,将数据和索引分离到单独的表空间中没有任何好处。长期以来,有一个神话认为分离索引和数据有利于提高性能——这是不正确的。
临时对象应该(而且必须)存储在临时表空间中。如果您想将这些大型临时表隔离到一个单独的表空间中,您可以增加 TEMP 表空间的大小或仅为将拥有这些对象的用户创建一个单独的临时表空间。您不能(也不想)将它们存储在永久表空间中。
不过,在架构上,我很好奇为什么在您的系统中需要临时表。如果您有将 10 GB 写入临时表的 session ,然后可能会再次读出这 10 GB 以便将数据写入其他地方,我倾向于怀疑是否有更有效的解决方案。在 Oracle 中甚至很少需要临时表——这在其他数据库中更为常见,在这些数据库中,读者可以阻止编写者在处理数据之前需要将数据从表中复制出来。 Oracle 没有此类限制。
关于database - Oracle 10g 临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1875311/