简单的问题,我有一个大型数据库,即将转换大约40GB的列(是的,该列占40GB,在90的表中)和7-8百万行,因此速度至关重要。 / p>
我正在使用的代码是这样的。
ALTER TABLE KJOERETOEY
RENAME column ORIGIN TO ORIGIN_OLD;
ALTER TABLE KJOERETOEY
ADD ORIGIN XMLTYPE NULL;
UPDATE KJOERETOEY
SET ORIGIN = xmlparse(document ORIGIN_OLD);
ALTER TABLE KJOERETOEY
drop column ORIGIN_OLD;
然后在我闲暇时等待它完成,我注意到存在一个xmltype.createXML,我唯一能看到的缺点是,如果数据为NULL,它会抛出一个错误,这是正常的数据不应为空。
所以问题。
是
UPDATE KJOERETOEY
SET ORIGIN = xmlparse(document ORIGIN_OLD);
比
更快或更慢UPDATE KJOERETOEY
SET ORIGIN = xmltype.createXML(ORIGIN_OLD);
是否有任何技巧可以用来提高此类操作的速度。
答案 0 :(得分:1)
使用40 GB的XML数据,我会假设大部分时间都花在编写LOB数据上。
我不会使用UPDATE
来执行此操作,而是使用新结构创建一个新表。
此外,我会将新列和新列放置在不同的表空间中,以使事后清理起来更容易。
对于XMLTYPE,我考虑将其存储为BINARY XML。
我将其存储在SECUREFILE中,而不是BASICFILE
如果您具有Advanced Compression选项,则尝试以压缩形式存储BINARY XML。
用少量样品进行测试。
RENAME TABLE kjoeretoey TO kjoeretoey_old;
CREATE TABLE kjoeretoey (
id number,
origin XMLTYPE,
...
) XMLTYPE COLUMN origin STORE AS SECUREFILE BINARY XML (
TABLESPACE my_xml_tablespace DISABLE STORAGE IN ROW COMPRESS HIGH
);
INSERT INTO kjoeretoey (id, origin, ...)
SELECT id, XMLTYPE(origin) ... FROM kjoeretoey_old;
DROP TABLE kjoeretoey_old;