如何处理Oracle中TEMP表空间满的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何处理Oracle中TEMP表空间满的问题相关的知识,希望对你有一定的参考价值。
一般情况下,在完成Select语句、create index等一些使用TEMP表空间的排序操作后,Oracle是会自动释放掉临时段a的。但有些有侯我们则会遇到临时段没有被释放,TEMP表空间几乎满的状况,甚至是我们重启了数据库仍没有解决问题。这个问题在论坛中也常被网友问到,下面我总结一下,给出几种处理方法。 方法一、重启库库重启时,Smon进程会完成临时段释放,TEMP表空间的清理操作,不过很多的时侯我们的库是不允许down的,所以这种方法缺少了一点的应用机会,不过这种方法还是很好用的。 方法二、Metalink给出的一个方法修改一下TEMP表空间的storage参数,让Smon进程观注一下临时段,从而达到清理和TEMP表空间的目的。 SQL>alter tablespace temp increase 1; SQL>alter tablespace temp increase 0;方法三、我常用的一个方法,具体内容如下:1、 使用如下语句a查看一下认谁在用临时段SELECT username, sid, serial#, sql_address, machine, program, tablespace, segtype, contents FROM v$session se, v$sort_usage su WHERE se.saddr=su.session_addr2、那些正在使用临时段的进程SQL>Alter system kill session 'sid,serial#'; 3、把TEMP表空间回缩一下SQL>Alter tablespace TEMP coalesce;
方法四、使用诊断事件的一种方法,也是被我认为是“杀手锏”的一种方法 1、 确定TEMP表空间的ts#SQL>select ts#, name from sys.ts$ ; TS# NAME ----------------------- 0 SYSYEM 1 RBS 2 USERS 3* TEMP 4 TOOLS 5 INDX 6 DRSYS 2、 执行清理操作SQL>alter session set events 'immediate trace name DROP_SEGMENTS level 4' ;说明:temp表空间的TS# 为 3*, So TS#+ 1= 4
其它: 1、 出现如上问题的原因我认为可能是由于大的排序超出了TEMP表空间的空间允许范围引起的。也可能包含着其它的异常的因素。 2、 观注TEMP等这些空间的状态是Dba日常职责之一,我们可以通过Toad、Object Browser等这些工具办到,也可以用如下的语句: SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100, 2), '990.99') "使用比", F.TOTAL_BYTES "空闲空间(M)", F.MAX_BYTES "最大块(M)" FROM (SELECT TABLESPACE_NAME, ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES, ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES FROM SYS.DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F, (SELECT DD.TABLESPACE_NAME, ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB FROM SYS.DBA_DATA_FILES DD GROUP BY DD.TABLESPACE_NAME) D WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME ORDER BY 4 DESC;(责任编辑:卢兆林) 参考技术A temp表空间一般是自动扩展的,满的话
我遇到过一次,把temp表空间drop,然后再创建一个缓存表空间
Lua 表在内存中是如何处理的?
【中文标题】Lua 表在内存中是如何处理的?【英文标题】:How are Lua tables handled in memory? 【发布时间】:2015-07-07 19:59:01 【问题描述】:lua 如何处理表的增长?
它相当于Java中的ArrayList
吗? IE。一个需要连续内存空间的,当它比已经分配的空间大时,内部数组被复制到另一个内存空间。
有没有聪明的方法来引导它?
我的问题是,表是如何存储在内存中的?我不是问如何在 Lua 中实现数组。
【问题讨论】:
我们在 Lua 中简单地通过使用整数索引表来实现数组。因此,数组没有固定的大小,而是根据需要增长。 lua.org/pil/11.1.html @RobertHarvey 我已经编辑了我的问题,我怀疑 Lua 如何处理这是“记忆视觉”。 “数组”是一个“幕后”术语。 Lua 表是一组键值对,其中键和值都不能是nil
。如果表具有连续的正整数键并且从 1 开始,则称该表“具有序列”。长度运算符#
仅适用于序列(或“空序列”),ipairs
在第一个缺失的正整数键之前结束。实现的可能性由此而来。
【参考方案1】:
(假设您指的是最新版本的 Lua;描述 5.3 的行为应该(几乎?)与 5.0-5.2 相同。)
在底层,一个表包含一个数组和一个哈希部分。两者都(独立地)以二次幂的方式增长和缩小,如果不需要,两者都可能不存在。
大多数键值对将存储在哈希部分。但是,所有正整数键(从 1 开始)都是存储在数组部分中的候选者。数组部分只存储值而不存储键(因为它们等价于元素在数组中的位置)。最多允许一半的分配空间为空(即包含nil
s - 作为间隙或作为尾随空闲槽)。 (会留下太多空槽的数组候选将被放入散列部分。如果数组部分已满但散列部分有剩余空间,则任何条目都将进入散列部分。)
对于数组和哈希部分,插入可以触发调整大小,如果之前已经删除了足够多的条目,则可以调整到下一个较大的 2 次方或下降到任何较小的 2 次方。 (实际上触发缩小大小并非易事:rehash
是唯一调整表格大小的地方(并且两个部分同时调整大小),并且只能从 luaH_newkey
调用 if 两部分中的任何一个都没有足够的空间1。)
更多信息,你可以看The Implementation of Lua 5.0的第4章,或者查看源代码:基本上所有相关的都发生在ltable.c
,有趣的阅读起点是rehash
(in ltable.c
)(调整大小功能),以及主解释器循环 luaV_execute
(in lvm.c
) 或更具体地说是 luaV_settable
(also there)(在表中存储键值对时会发生什么情况)。
1例如,为了缩小包含大数组部分且没有散列的表,您必须清除所有数组条目,然后将条目添加到散列部分(即使用非整数键,值可以是任何包括 nil
),最终得到一个不包含数组部分和一个单元素散列部分的表。
如果两个部分都包含条目,则必须首先清除哈希部分,然后向数组部分添加足够的条目以填充数组和哈希的组合(触发调整大小,这将为您留下一个包含大数组部分的表和没有哈希),然后如上所述清除数组。2(首先清除数组,然后哈希将不起作用,因为在清除这两个部分后,您将没有数组和一个巨大的哈希部分,并且您无法触发调整大小,因为任何条目都只会进入散列。)
2实际上, 把桌子扔掉换一张新桌子要容易得多。为了确保缩小表,您需要知道实际分配的容量(不是当前条目数,并且 Lua 不会告诉你,至少不会直接告诉你) ,然后让所有步骤和所有大小都恰到好处 - 混淆步骤的顺序或无法触发调整大小,你最终会得到一个巨大的表,如果你将它用作数组,它甚至可能执行得更慢…(存储在哈希中的候选数组也存储它们的键,例如缓存行中有用数据量的一半。)
【讨论】:
我相信只有插入才能触发调整大小。这就是为什么允许在迭代期间使用next() 清除现有字段,但如果添加字段则未定义。 首先,感谢您的帮助,但对不起,我在 C 语言中很笨,我已经阅读了 Itable.c 文件,但我不明白一些事情:如果密钥散列会发生什么相撞?如果散列部分增长(或缩小),是否将其复制到内存的另一部分(以保持连续分配)?我找不到关于那个的详细解释 @JohnnyWiller:散列在实施文件的第 4 章(见第 8 页,该章的最后一段)中(简要)解释,更多信息可以在the paper referenced there 中找到。至于调整大小:您是否阅读了实施文件?那里有描述(第 7 页,第 2 段)——是复制的,是连续的。 @siffiejoe 对,完全跳过了这部分的思考——感谢您的关注!现在应该修复,经过更多的阅读和测试,我很确定我现在所描述的确实是发生了什么。【参考方案2】:从 Lua 5.0 开始,表是哈希表和数组的混合体。来自The Implementation of Lua 5.0:
用于优化用作数组的表的新算法:
与其他脚本语言不同, Lua 不提供数组类型。相反,Lua 程序员使用 具有整数索引的常规表来实现数组。 Lua 5.0 使用了一个新的 检测表是否被用作数组并自动检测的算法 将与数字索引关联的值存储在实际数组中, 而不是将它们添加到哈希表中。该算法在 第 4 节。
以前的版本只有哈希表。
【讨论】:
@JohnnyWiller 怎么样? GC 会扫描表的数组部分和哈希部分。 @ColonelThirtyTwo 是的,我知道。我在问表哈希部分是否增长,是否将其复制到内存的另一部分,以保持连续分配(就像 java 一样)? @JohnnyWillerAfter computing the new sizes, Lua creates the new parts and re-inserts the elements from the old parts into the new ones
所以我猜它们在增长后仍然是连续的。阅读我链接的文件的第 4 节,他们解释得比我好:-)以上是关于如何处理Oracle中TEMP表空间满的问题的主要内容,如果未能解决你的问题,请参考以下文章