我注意到这两个系统中临时表的概念是不同的,我有一个思考..。在MySQL中有以下场景:
如何在Oracle中实现相同的场景?我可以(在一个过程中更可取)创建一个临时表,填充它,并在另一个(非临时)表中插入数据吗?
我认为我可以使用一个(全局)临时表来截断提交,并避免步骤1和2,但我也需要其他人的意见。
发布于 2011-08-25 16:00:24
在Oracle中,最初很少需要临时表。在其他数据库中,您通常需要临时表,因为这些数据库没有实现多版本读取一致性,而且在运行过程时,从表中读取数据的人可能会被阻塞,或者如果过程不将数据保存到单独的结构中,则会执行脏读。由于这两个原因,您不需要Oracle中的全局临时表,因为读取器不阻止写入器,并且不可能进行脏读取。
如果在执行PL/SQL计算时只需要临时存储数据,则PL/SQL集合比Oracle中的临时表更常用。这样,您就不会将数据从PL/SQL引擎来回推送到SQL引擎并返回到PL/SQL引擎。
CREATE PROCEDURE do_some_processing
AS
TYPE emp_collection_typ IS TABLE OF emp%rowtype;
l_emps emp_collection_type;
CURSOR emp_cur
IS SELECT *
FROM emp;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur
BULK COLLECT INTO l_emps
LIMIT 100;
EXIT WHEN l_emps.count = 0;
FOR i IN 1 .. l_emps.count
LOOP
<<do some complicated processing>>
END LOOP;
END LOOP;
END;您可以创建全局临时表(在过程之外),并在过程中使用全局临时表,就像使用任何其他表一样。因此,如果您愿意,可以继续使用临时表。但是,一方面,我可以指望我在Oracle中确实需要一个临时表的次数。
发布于 2011-08-25 15:24:27
你说得对,临时桌子会让你工作的。
如果您决定坚持使用常规表,您可能需要使用@Johan给出的建议,以及
ALTER TABLE <table name> NOLOGGING;让它表现得更快一些。
发布于 2011-08-25 15:19:09
我认为你正在使用的方案没有问题。
注意,它不必是临时表,您也可以使用某种类型的内存表。
按照通常的方式创建一个表,然后执行
ALTER TABLE <table_name> CACHE; 这将对表进行优先排序,以便在内存中存储。
只要您填充和,按短时间顺序清空表,就不需要执行步骤1& 2。
记住,cache修饰符只是一个提示。该表在缓存中仍处于老化状态,最终将从内存中移出。
只要做:
https://stackoverflow.com/questions/7192774
复制相似问题