2014-10-17 3 views
4

Я использую oracle10gR2 10.2.0.4 и solaris10 64bitвставки в столбец 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

Почему у вас есть 'word.testmeta' в' from'? – Mat

+0

testmeta в слове schema, поэтому word.testmeta – pangjiale

ответ

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

+0

Я получил LPX-00601: Недопустимый токен в: '/*/substring (KEWOR, 254, 4000) 'с подстрокой пути KEWOR varchar2 (4000)' (KEWOR, 254, 4000) ' – pangjiale

+0

Подстройка KEWOR varchar2 (4000) path' (KEWOR, 254, 4000) 'не работает с версия 10gR2 10.2.0.4 – pangjiale

Смежные вопросы