Go Premium for a chance to win a PS4. Enter to Win

x
?
Solved

CLOB update performance

Posted on 2013-01-15
4
Medium Priority
?
975 Views
Last Modified: 2013-04-04
I am updating a CLOB column from a varchar2 column in the same table.  My sql is:


update mytable a
SET ON_NARRATIVE_CLOB=(select RTRIM(EXTRACT(XMLAGG(XMLELEMENT("x", NARRATIVE||chr(32)) order by LINE), '/x/text()').getclobval(),',')
                                                from mytable b
                                                where a.column= b.column
                                                )

I have 1.2 million rows.  The update is very slow.  Any suggestions, comments, direction would be appreciated.  This is a one-time load for now and incrementals after this first load but I would like to get it as fast as possible.  Oracle 11.2.  Should I rewrite with PL/SQL?  Use a staging table?  Thanks.
0
Comment
Question by:diannagibbs
  • 2
  • 2
4 Comments
 
LVL 74

Expert Comment

by:sdstuber
ID: 38780249
try this....


CREATE OR REPLACE TYPE vcarray AS TABLE OF varchar2(4000);


CREATE OR REPLACE FUNCTION tbl2clob(p_tbl IN vcarray, p_delimiter IN VARCHAR2 DEFAULT ',')
    RETURN CLOB
    DETERMINISTIC
IS
    v_str    VARCHAR2(32767);
    v_clob   CLOB;
BEGIN
    DBMS_LOB.createtemporary(v_clob, TRUE);

    IF p_tbl.COUNT > 0
    THEN
        v_str  := p_tbl(1);

        FOR i IN 2 .. p_tbl.COUNT
        LOOP
            -- Appending to clobs is slower than appending to varchar2
            -- so use varchar2 until you can't anymore then append one big chunk

            v_str  := v_str || p_delimiter || p_tbl(i);

            IF LENGTH(v_str) > 28700
            THEN
                v_clob  := v_clob || v_str;
                v_str   := NULL;
            END IF;
        END LOOP;
    END IF;

    IF v_str IS NOT NULL
    THEN
        v_clob  := v_clob || v_str;
    END IF;

    RETURN v_clob;
END;
/


UPDATE mytable a
   SET on_narrative_clob      =
           (SELECT tbl2clob(CAST(COLLECT(b.narrative ORDER BY b.line) AS vcarray), ' ')
              FROM mytable b
             WHERE a.column = b.column)
0
 

Author Comment

by:diannagibbs
ID: 38782609
Unfortunately, this is increasing my time by 3.  This is a development database with small SGA.  Very challenging.
0
 
LVL 74

Accepted Solution

by:
sdstuber earned 2000 total points
ID: 38782724
how odd,  the COLLECT method is consistently faster for me.

Also, as the data volume grows XMLAGG will eventually hit ORA-31186: Document contains too many nodes

and, if you happen to have any strings of 4000 characters the XMLAGG method will fail
with  ORA-01489: result of string concatenation is too long


Using COLLECT, these errors don't occur.
It's not only faster but, more importantly is able to finish whereas XMLAGG simply fails.
0
 

Author Comment

by:diannagibbs
ID: 38785383
I'll try it again tomorrow.  I finally was able to get the 1.3mill rows to complete but took 3 hours.
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I remember the day when someone asked me to create a user for an application developement. The user should be able to create views and materialized views and, so, I used the following syntax: (CODE) This way, I guessed, I would ensure that use…
Using SQL Scripts we can save all the SQL queries as files that we use very frequently on our database later point of time. This is one of the feature present under SQL Workshop in Oracle Application Express.
This video shows how to Export data from an Oracle database using the Datapump Export Utility.  The corresponding Datapump Import utility is also discussed and demonstrated.
This videos aims to give the viewer a basic demonstration of how a user can query current session information by using the SYS_CONTEXT function
Suggested Courses

916 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question