2014-10-17 55 views
4

我使用oracle10gR2 10.2.0.4和Solaris10的64位插入到VARCHAR2列從XMLType列選擇:極其緩慢

我需要從XML在XMLType列表中選擇數據值(word.testmeta ) 並插入到另一個表(word.testwordyy)

desc word.testmeta; 
Name     Null? Type 
-------------------------------------- 
FILENAME    CHAR(2000) 
XMLDATA    XMLTYPE 

desc word.testwordyy; 
Name     Null? Type 
--------------------------------------- 
ID     VARCHAR2(255) 
KEYWORD    VARCHAR2(4000) 

和我使用XMLTABLE並執行:

insert /*+append */ into word.testwordyy(KEYWORD) 
select /*+ gather_plan_statistics */ dbms_lob.substr(xmltype.getclobval(b.KEWOR),254) 
from word.testmeta , xmltable 
(
'$B/mets/KEWOR' 
passing 
word.testmeta.XMLDATA as B 
columns 
KEWOR xmltype path '/KEWOR/text()' 
) 
b 

這裏是解釋計劃select * from table(dbms_xplan.display_cursor(null,null,'iostats last'));

PLAN_TABLE_OUTPUT 
----------------------------------------------------------------------------------------------------------------------------------- 
SQL_ID 37ua3npnxx8su, child number 0 
------------------------------------- 
insert /*+append */ into word.testwordyy(KEYWORD) select /*+ gather_plan_statistics */ 
dbms_lob.substr(xmltype.getclobval(b.KEWOR),254) from word.testmeta , xmltable ('$B/mets/KEWOR' passing 
    > word.testmeta.XMLDATA as 
B columns KEWOR xmltype path '/KEWOR/text()') b 

Plan hash value: 875848213 
----------------------------------------------------------------------------------------------------------------------------------- 

PLAN_TABLE_OUTPUT 
----------------------------------------------------------------------------------------------------------------------------------- 
| Id | Operation       | Name     | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads | Writes | 
----------------------------------------------------------------------------------------------------------------------------------- 
| 1 | LOAD AS SELECT      |      |  1 |  |  1 |00:10:32.72 | 16832 |  7 | 90 | 
| 2 | NESTED LOOPS      |      |  1 |  29M| 34688 |00:00:25.95 | 12639 |  5 | 0 | 
| 3 | TABLE ACCESS FULL    | TESTMETA    |  1 | 3638 | 3999 |00:00:00.08 |  909 |  0 | 0 | 
| 4 | COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE | 3999 |  | 34688 |00:00:24.50 | 11730 |  5 | 0 | 

Note 
----- 
    - dynamic sampling used for this statement 


21 rows selected. 

,並在表word.testmeta行的次數越多,時間越長,每行花費

我的XML很簡單,小而需要處理它們的數量很大(5000000) 並且處理速度非常慢,當行數超過8000時需要幾個小時。 有沒有優化或更快的方法?

+0

爲什麼在'from'中有'word.testmeta'? – Mat 2014-10-19 08:49:26

+0

testmeta在word schema中,所以word.testmeta – pangjiale 2014-10-21 13:12:08

回答

1

您已將KEYWOR列定義爲XMLTYPE。這是爲什麼? XMLTABLE的全部重點是將XML結構轉換爲關係列。如果您將該列定義爲簡單字符串,則可避免大量不必要的轉換。

「的標籤的內容超過4000個字符>>>是否有任何方法來子串在XMLTABLE的標籤的內容」

有是XPath substring功能。

insert /*+append */ into word.testwordyy(KEYWORD) 
select /*+ gather_plan_statistics */ b.KEWOR 
from word.testmeta 
    , xmltable 
     (
     '$B/mets/KEWOR' 
     passing 
     word.testmeta.XMLDATA as B 
     columns 
     KEWOR varchar2(4000) path 'substring(KEWOR, 254, 4000)' 
    ) b 

在這裏,我已經開始在您的原始文章中使用偏移量爲254的子字符串。我也明確地將其長度設置爲4000.

我不認爲您需要在聲明列時明確引用text()節點。

+0

標籤的內容超過4000個字符,所以將KEYWOR列定義爲XMLTYPE可以使該錯誤無效:ORA-01706:用戶函數結果值太大。是否有任何方法來將標記的內容在xmltable中進行子字符串排序,如下所示:KEWOR varchar2(4000)path'/KEWOR/text().substr(4000)' – pangjiale 2014-10-20 02:15:35

+0

我得到了LPX-00601:Invalid token in:' 'KEWOR varchar2(4000)'子字符串(KEWOR,2​​54,4000)'的子字符串(KEWOR,2​​54,4000)' – pangjiale 2014-10-20 14:25:14

+0

KEWOR varchar2(4000)'子字符串(KEWOR,2​​54,4000)'不起作用版本10gR2 10.2.0.4 – pangjiale 2014-10-21 03:06:44