Re: RE: RE: Re: Can Bind variables be an issue with respect to network transfer?

From: Mikhail Velikikh <mvelikikh_at_gmail.com>
Date: Wed, 14 Oct 2020 20:07:35 +0100
Message-ID: <CALe4Hpm1xyAE5DV9Gur4_y1A5pqaGq-pameb3qE8vKv+Z0KVPw_at_mail.gmail.com>



It seems to be the recursion this time around: ORA-07445 [kkqojeanl()] Internal Error for Query with Large Number of Elements in an IN List (Doc ID 1577011.1)
The call stack is as follows:

[TOC00006]

----- Call Stack Trace -----

calling              call     entry                argument values in hex
location             type     point                (? means dubious value)
-------------------- -------- --------------------
----------------------------
....
__sighandler()       call     sslsshandler()       00000000B 7FA6C86304B0
                                                   7FA6C8630380
7FA6C8630380 ?
                                                   7FA6C86302C0 ? 000000083
?
kkqojeanl()+13       signal   __sighandler()       7FA6C7B8FC10 7FA6B11C1740
                                                   7FFFAE426A10 000000000 ?
                                                   000000000 ? 000000000 ?
.......
kkqojeanl()+1262     call     kkqojeanl()          7FA6C7B8FC10 ?
7FA6B3193E20 ?
                                                   7FFFAE426A10 ? 000000000
?
                                                   000000000 ? 000000000 ?
kkqojeanl()+1262     call     kkqojeanl()          7FA6C7B8FC10 ?
7FA6B31942D8 ?
                                                   7FFFAE426A10 ? 000000000
?
                                                   000000000 ? 000000000 ?




  • At frame 60 recursion pattern of size 1 found, for return address kkqojeanl()+1262 suppressing printing.*** 2020-10-14T18:58:35.096350+00:00**** At frame 232303 recursion pattern broken, last return was* kkqojeanl() 000000000358FDB3 call 0000000010F7601E 7FA6C7B8FC10 ? 7FA6C7B8FB20 ?

The PGA allocations don't ring any bells yet:

  • failed execution
    [oracle_at_rac1 trace]$ grep "WAIT #139775539487712: nam='PGA memory
    operation'" racdb1_ora_16214.trc | awk '{s+=substr($8,4)} END {print s}' 357040128
  • successful execution
    [oracle_at_rac1 trace]$ grep "WAIT #140518643268912: nam='PGA memory
    operation'" racdb1_ora_15778.trc | awk '{s+=substr($8,4)} END {print s}' 18939904

On Wed, 14 Oct 2020 at 19:49, Jonathan Lewis <jlewisoracle_at_gmail.com> wrote:

>
> With things like this it's sometimes the maximum unit size for memory
> allocation that is the issue.
> 16MB or 64MB might be a relevant figure.
> Possibly if you enabled sql_trace with waits and summed the PGA allocate
> memory sizes you might spot a significant number at the point of failure.
>
> Regards
> Jonathan Lewis
>
>
> On Wed, 14 Oct 2020 at 19:23, Mikhail Velikikh <mvelikikh_at_gmail.com>
> wrote:
>
>> Rogel,
>>
>>> And it seems to show that 1e5 is not the upper bound, at least 2 * 1e5
>>> still seems to work:
>>>
>>
>> Indeed, I have played with your code a little bit and was able to run it
>> with 232K IN lists. I applied the TO_CHAR function to make it work (it is
>> one of the versions I tested - it uses 3-column sets):
>>
>> declare
>>   stmt clob default 'select null from dual where (0,0,0) in (';
>> begin
>>   for i in 1..1e5 loop
>>     stmt:=stmt||*to_char*('(10,'||i||',0),');
>>   end loop;
>>   stmt:=stmt||*to_char*('(0,-1,0))');
>>   dbms_output.put_line(dbms_lob.getlength(stmt));
>>   execute immediate stmt;
>> end;
>> /
>>
>>
>> Unless it’s a multi-value IN list, which is limited to 1e5 elements.
>>
>>
>> I see only a StackOverflow thread that mentions 1e5:
>> https://stackoverflow.com/questions/400255/how-to-put-more-than-1000-values-into-an-oracle-in-clause#comment85743305_17019130
>> Nehad, where did you get that information about 1e5 elements?
>> The documentation mentions no restriction since 9.2:
>>
>> https://docs.oracle.com/cd/B10501_01/server.920/a96540/expressions14a.htm#1029285
>>
>>> A comma-delimited list of expressions can contain no more than 1000
>>> expressions. A comma-delimited list of sets of expressions can contain any
>>> number of sets, but each set can contain no more than 1000 expressions.
>>>
>> I am not getting consistent results across my database instances for
>> Rogel's sample code, but I have been able to run queries as long as 232K IN
>> lists in 12.2.
>> It is very inconsistent, though. Some successful attempts suddenly ended
>> up in:
>> ORA-07445: exception encountered: core dump [kkqojeanl()+13] [SIGSEGV]
>> [ADDR:0x7FFF3A51AFE8] [PC:0x10F75B3D] [Address not mapped to object] []
>> or
>> ORA-07445: exception encountered: core dump [expCheckExprEquiv()+641]
>> [SIGSEGV] [ADDR:0x7FFF9F4EBF88] [PC:0x10EB9341] [Address not mapped to
>> object] []
>>
>> *-- works with 232293 2-column sets*
>> SQL> _at_inlist 232292
>> SQL> set echo on
>> SQL>
>> SQL> conn / as sysdba
>> Connected.
>> SQL>
>> SQL> alter system flush shared_pool;
>>
>> System altered.
>>
>> Elapsed: 00:00:00.02
>> SQL>
>> SQL> set serverout on
>> SQL>
>> SQL> declare
>>   2    stmt clob default 'select null from dual where (0,0) in (';
>>   3  begin
>>   4    for i in 1..&1. loop
>>   5      stmt:=stmt||to_char('(0,'||i||'),');
>>   6    end loop;
>>   7    stmt:=stmt||to_char('(0,-1))');
>>   8    dbms_output.put_line(dbms_lob.getlength(stmt));
>>   9    execute immediate stmt;
>>  10  end;
>>  11  /
>> old   4:   for i in 1..&1. loop
>> new   4:   for i in 1..232292 loop
>> 2444152
>>
>> PL/SQL procedure successfully completed.
>>
>> Elapsed: 00:00:09.99
>> SQL>
>>
>> *-- fails with 232294 2-column sets*
>> SQL> _at_inlist 232293
>> SQL> set echo on
>> SQL>
>> SQL> conn / as sysdba
>> Connected.
>> SQL>
>> SQL> alter system flush shared_pool;
>>
>> System altered.
>>
>> Elapsed: 00:00:00.00
>> SQL>
>> SQL> set serverout on
>> SQL>
>> SQL> declare
>>   2    stmt clob default 'select null from dual where (0,0) in (';
>>   3  begin
>>   4    for i in 1..&1. loop
>>   5      stmt:=stmt||to_char('(0,'||i||'),');
>>   6    end loop;
>>   7    stmt:=stmt||to_char('(0,-1))');
>>   8    dbms_output.put_line(dbms_lob.getlength(stmt));
>>   9    execute immediate stmt;
>>  10  end;
>>  11  /
>> old   4:   for i in 1..&1. loop
>> new   4:   for i in 1..232293 loop
>> ERROR:
>> ORA-03114: not connected to ORACLE
>>
>>
>> declare
>> *
>> ERROR at line 1:
>> ORA-03113: end-of-file on communication channel
>> Process ID: 27742
>> Session ID: 747 Serial number: 5064
>>
>>
>> Elapsed: 00:00:34.74
>> SQL>
>>
>> *-- works with 232293 2-column sets, when the first column is '10' rather
>> than '0' - I am checking if it is a sql_text length limit.*
>> SQL> _at_inlist 232292
>> SQL> set echo on
>> SQL>
>> SQL> conn / as sysdba
>> Connected.
>> SQL>
>> SQL> alter system flush shared_pool;
>>
>> System altered.
>>
>> Elapsed: 00:00:00.01
>> SQL>
>> SQL> set serverout on
>> SQL>
>> SQL> declare
>>   2    stmt clob default 'select null from dual where (0,0) in (';
>>   3  begin
>>   4    for i in 1..&1. loop
>>   5      stmt:=stmt||to_char('(*10*,'||i||'),');
>>   6    end loop;
>>   7    stmt:=stmt||to_char('(0,-1))');
>>   8    dbms_output.put_line(dbms_lob.getlength(stmt));
>>   9    execute immediate stmt;
>>  10  end;
>>  11  /
>> old   4:   for i in 1..&1. loop
>> new   4:   for i in 1..232292 loop
>> 2676444
>>
>> PL/SQL procedure successfully completed.
>>
>> Elapsed: 00:00:20.31
>> SQL>
>>
>> *-- works with 232293 3-column sets*
>> SQL> _at_inlist 232292
>> SQL> set echo on
>> SQL>
>> SQL> conn / as sysdba
>> Connected.
>> SQL>
>> SQL> alter system flush shared_pool;
>>
>> System altered.
>>
>> Elapsed: 00:00:00.02
>> SQL>
>> SQL> set serverout on
>> SQL>
>> SQL> declare
>>   2    stmt clob default 'select null from dual where (0,0,0) in (';
>>   3  begin
>>   4    for i in 1..&1. loop
>>   5      stmt:=stmt||to_char('(10,'||i||',0),');
>>   6    end loop;
>>   7    stmt:=stmt||to_char('(0,-1,0))');
>>   8    dbms_output.put_line(dbms_lob.getlength(stmt));
>>   9    execute immediate stmt;
>>  10  end;
>>  11  /
>> old   4:   for i in 1..&1. loop
>> new   4:   for i in 1..232292 loop
>> 3141032
>>
>> PL/SQL procedure successfully completed.
>>
>> Elapsed: 00:00:23.44
>> SQL>
>>
>> *-- fails with 232294 3-column sets*
>> SQL> _at_inlist 232293
>> SQL> set echo on
>> SQL>
>> SQL> conn / as sysdba
>> Connected.
>> SQL>
>> SQL> alter system flush shared_pool;
>>
>> System altered.
>>
>> Elapsed: 00:00:00.01
>> SQL>
>> SQL> set serverout on
>> SQL>
>> SQL> declare
>>   2    stmt clob default 'select null from dual where (0,0,0) in (';
>>   3  begin
>>   4    for i in 1..&1. loop
>>   5      stmt:=stmt||to_char('(10,'||i||',0),');
>>   6    end loop;
>>   7    stmt:=stmt||to_char('(0,-1,0))');
>>   8    dbms_output.put_line(dbms_lob.getlength(stmt));
>>   9    execute immediate stmt;
>>  10  end;
>>  11  /
>> old   4:   for i in 1..&1. loop
>> new   4:   for i in 1..232293 loop
>> ERROR:
>> ORA-03114: not connected to ORACLE
>>
>>
>> declare
>> *
>> ERROR at line 1:
>> ORA-03113: end-of-file on communication channel
>> Process ID: 29500
>> Session ID: 258 Serial number: 32984
>>
>>
>> Elapsed: 00:00:10.67
>>
>>
>>
>> On Wed, 14 Oct 2020 at 19:17, <rogel_at_web.de> wrote:
>>
>>> The correct way might be to use dbms_lob.append instead of ||.
>>> And it seems to show that 1e5 is not the upper bound, at least 2 * 1e5
>>> still seems to work:
>>>
>>>
>>> *SQL> set timi on sqlprompt "" variable n number*
>>> *exec :n := 1*
>>> *PL/SQL procedure successfully completed.*
>>> *Elapsed: 00:00:00.03*
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> *declare stmt clob default 'select null from dual where (0,0) in (';
>>> 2  begin   3  for i in 1 .. :n * 1e5 - 1 loop   4
>>> dbms_lob.append(stmt,'(0,'||i||'),');   5  end loop;   6
>>> dbms_lob.append(stmt,'(0,-1))');   7  execute immediate stmt;   8  end;
>>> 9  /*
>>> *PL/SQL procedure successfully completed.*
>>> *Elapsed: 00:00:03.95*
>>> *exec :n := 2*
>>> *PL/SQL procedure successfully completed.*
>>>
>>> *Elapsed: 00:00:00.02 /*
>>> *PL/SQL procedure successfully completed.*
>>> *Elapsed: 00:00:08.95*
>>> *exec :n := 3*
>>> *PL/SQL procedure successfully completed.*
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> *Elapsed: 00:00:00.02 / declare stmt clob default 'select null from dual
>>> where (0,0) in ('; * ERROR at line 1: ORA-03113: end-of-file on
>>> communication channel Process ID: 32310 Session ID: 30 Serial number: 31943*
>>>
>>> *Elapsed: 00:01:48.09*
>>>
>>>
>>> *exec :n := 10 ERROR: ORA-03114: not connected to ORACLE*
>>>
>>>
>>>
>>>
>>>
>>>
>>> *Gesendet:* Mittwoch, 14. Oktober 2020 um 19:15 Uhr
>>> *Von:* "Noveljic Nenad" <nenad.noveljic_at_vontobel.com>
>>> *An:* "tim.evdbt_at_gmail.com" <tim.evdbt_at_gmail.com>, "rogel_at_web.de" <
>>> rogel_at_web.de>
>>> *Cc:* "jlewisoracle_at_gmail.com" <jlewisoracle_at_gmail.com>, "Oracle L" <
>>> oracle-l_at_freelists.org>
>>> *Betreff:* RE: Aw: RE: Re: Can Bind variables be an issue with respect
>>> to network transfer?
>>>
>>> The exception was raised even before execute immediate.
>>>
>>> The correct way to try this would be to spool the statement into the
>>> file and run it with _at_file from sqlplus.
>>>
>>>
>>>
>>> *From:* Tim Gorman <tim.evdbt_at_gmail.com>
>>> *Sent:* Mittwoch, 14. Oktober 2020 19:11
>>> *To:* rogel_at_web.de
>>> *Cc:* Noveljic Nenad <nenad.noveljic_at_vontobel.com>;
>>> jlewisoracle_at_gmail.com; Oracle L <oracle-l_at_freelists.org>
>>> *Subject:* Re: Aw: RE: Re: Can Bind variables be an issue with respect
>>> to network transfer?
>>>
>>>
>>>
>>> Even though you declared the variable as CLOB, I'm guessing that there
>>> might be a VARCHAR2(32767) limitation for EXECUTE IMMEDIATE?
>>>
>>> Can you measure the length of "stmt" before EXECUTE IMMEDIATE and add an
>>> exception handler that shares that length as well as the error, perhaps
>>> something like...
>>>
>>>            len := length(stmt);
>>>            execute immediate stmt;
>>>     exception
>>>           when others then
>>>                   dbms_output.put_line('len = '||len);
>>>                   raise;
>>>     end;
>>>     /
>>>
>>> Just an idea...
>>>
>>>
>>>
>>> On 10/14/2020 9:07 AM, rogel_at_web.de wrote:
>>>
>>> ok, "line 4" != "line 7"
>>>
>>>
>>>
>>>
>>>
>>> *Gesendet:* Mittwoch, 14. Oktober 2020 um 18:04 Uhr
>>> *Von:* rogel_at_web.de
>>> *An:* nenad.noveljic_at_vontobel.com
>>> *Cc:* "jlewisoracle_at_gmail.com" <jlewisoracle_at_gmail.com>
>>> <jlewisoracle_at_gmail.com> <jlewisoracle_at_gmail.com>, "Oracle L"
>>> <oracle-l_at_freelists.org> <oracle-l_at_freelists.org>
>>> *Betreff:* Aw: RE: Re: Can Bind variables be an issue with respect to
>>> network transfer?
>>>
>>> I am not able to reproduce this 1e5, for me it seems to be 3760 instead,
>>> see (note: execute immediate select-stmt just parses the select-stmt)
>>>
>>>
>>>
>>> *declare stmt clob default 'select null from dual where (0,0) in (';*
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> *begin for i in 1..3760 loop stmt:=stmt||'(0,'||i||'),'; end loop;
>>> stmt:=stmt||'(0,-1))'; execute immediate stmt; end; /*
>>>
>>> *PL/SQL procedure successfully completed.*
>>>
>>> *3*
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> *  3* for i in 1..3760 loop c/0/1/   3* for i in 1..3761 loop l   1
>>> declare stmt clob default 'select null from dual where (0,0) in (';   2
>>> begin   3  for i in 1..3761 loop   4  stmt:=stmt||'(0,'||i||'),';   5  end
>>> loop;   6  stmt:=stmt||'(0,-1))';   7  execute immediate stmt;   8* end; /
>>> declare stmt clob default 'select null from dual where (0,0) in ('; * ERROR
>>> at line 1: ORA-06502: PL/SQL: numeric or value error ORA-06512: at line 4*
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> *Gesendet:* Mittwoch, 14. Oktober 2020 um 16:04 Uhr
>>> *Von:* "Noveljic Nenad" <nenad.noveljic_at_vontobel.com>
>>> <nenad.noveljic_at_vontobel.com>
>>> *An:* "jlewisoracle_at_gmail.com" <jlewisoracle_at_gmail.com>
>>> <jlewisoracle_at_gmail.com> <jlewisoracle_at_gmail.com>, "Oracle L"
>>> <oracle-l_at_freelists.org> <oracle-l_at_freelists.org>
>>> *Betreff:* RE: Re: Can Bind variables be an issue with respect to
>>> network transfer?
>>>
>>> “An IN list is limited to 1,000”
>>>
>>>
>>>
>>> Unless it’s a multi-value IN list, which is limited to 1e5 elements.
>>>
>>>
>>>
>>> Best regards,
>>>
>>>
>>>
>>> Nenad
>>>
>>>
>>>
>>> *From:* oracle-l-bounce_at_freelists.org <oracle-l-bounce_at_freelists.org>
>>> <oracle-l-bounce_at_freelists.org> *On Behalf Of *Jonathan Lewis
>>> *Sent:* Mittwoch, 14. Oktober 2020 16:00
>>> *To:* Oracle L <oracle-l_at_freelists.org> <oracle-l_at_freelists.org>
>>> *Subject:* Re: Re: Can Bind variables be an issue with respect to
>>> network transfer?
>>>
>>>
>>>
>>> Lothar,
>>>
>>>
>>>
>>> Comparing the ela for the "PGA allocate memory" with the matching "tim="
>>> I think what you're seeing is the time it takes Oracle to build an array
>>> and copy data from the SQL*Net packet to the array. Obviously some of the
>>> difference is about the time to write to the trace file, even so there's a
>>> lot of other CPU to account for.and it's happening between the memory
>>> allocations.  I doubt if "traffic" (i.e. movement across the network) is
>>> relevant - the ns calls are probably a layer above that moving the data
>>> between the sql*net layer and the session layer.
>>>
>>>
>>>
>>> I am curious about the internal_function() and 4,700 variables.  An IN
>>> list is limited to 1,000 and I wouldn't have expected an OR of IN lists to
>>> turn into a single internal_function(), Perhaps there's something about
>>> data types and character set conversion (or some other conversion) that's
>>> adding to the CPU time.
>>>
>>>
>>>
>>> Regards
>>>
>>> Jonathan Lewis
>>>
>>>
>>>
>>> ____________________________________________________
>>>
>>> Please consider the environment before printing this e-mail.
>>>
>>> Bitte denken Sie an die Umwelt, bevor Sie dieses E-Mail drucken.
>>>
>>>
>>> Important Notice
>>>
>>> This message is intended only for the individual named. It may contain
>>> confidential or privileged information. If you are not the named addressee
>>> you should in particular not disseminate, distribute, modify or copy this
>>> e-mail. Please notify the sender immediately by e-mail, if you have
>>> received this message by mistake and delete it from your system.
>>> Without prejudice to any contractual agreements between you and us which
>>> shall prevail in any case, we take it as your authorization to correspond
>>> with you by e-mail if you send us messages by e-mail. However, we reserve
>>> the right not to execute orders and instructions transmitted by e-mail at
>>> any time and without further explanation.
>>> E-mail transmission may not be secure or error-free as information could
>>> be intercepted, corrupted, lost, destroyed, arrive late or incomplete. Also
>>> processing of incoming e-mails cannot be guaranteed. All liability of
>>> Vontobel Holding Ltd. and any of its affiliates (hereinafter collectively
>>> referred to as "Vontobel Group") for any damages resulting from e-mail use
>>> is excluded. You are advised that urgent and time sensitive messages should
>>> not be sent by e-mail and if verification is required please request a
>>> printed version.
>>> Please note that all e-mail communications to and from the Vontobel
>>> Group are subject to electronic storage and review by Vontobel Group.
>>> Unless stated to the contrary and without prejudice to any contractual
>>> agreements between you and Vontobel Group which shall prevail in any case,
>>> e-mail-communication is for informational purposes only and is not intended
>>> as an offer or solicitation for the purchase or sale of any financial
>>> instrument or as an official confirmation of any transaction.
>>> The legal basis for the processing of your personal data is the
>>> legitimate interest to develop a commercial relationship with you, as well
>>> as your consent to forward you commercial communications. You can exercise,
>>> at any time and under the terms established under current regulation, your
>>> rights. If you prefer not to receive any further communications, please
>>> contact your client relationship manager if you are a client of Vontobel
>>> Group or notify the sender. Please note for an exact reference to the
>>> affected group entity the corporate e-mail signature. For further
>>> information about data privacy at Vontobel Group please consult
>>> www.vontobel.com.
>>>
>>> -- http://www.freelists.org/webpage/oracle-l
>>>
>>> -- http://www.freelists.org/webpage/oracle-l
>>>
>>>
>>>
>>>
>>> Important Notice
>>>
>>> This message is intended only for the individual named. It may contain
>>> confidential or privileged information. If you are not the named addressee
>>> you should in particular not disseminate, distribute, modify or copy this
>>> e-mail. Please notify the sender immediately by e-mail, if you have
>>> received this message by mistake and delete it from your system.
>>> Without prejudice to any contractual agreements between you and us which
>>> shall prevail in any case, we take it as your authorization to correspond
>>> with you by e-mail if you send us messages by e-mail. However, we reserve
>>> the right not to execute orders and instructions transmitted by e-mail at
>>> any time and without further explanation.
>>> E-mail transmission may not be secure or error-free as information could
>>> be intercepted, corrupted, lost, destroyed, arrive late or incomplete. Also
>>> processing of incoming e-mails cannot be guaranteed. All liability of
>>> Vontobel Holding Ltd. and any of its affiliates (hereinafter collectively
>>> referred to as "Vontobel Group") for any damages resulting from e-mail use
>>> is excluded. You are advised that urgent and time sensitive messages should
>>> not be sent by e-mail and if verification is required please request a
>>> printed version.
>>> Please note that all e-mail communications to and from the Vontobel
>>> Group are subject to electronic storage and review by Vontobel Group.
>>> Unless stated to the contrary and without prejudice to any contractual
>>> agreements between you and Vontobel Group which shall prevail in any case,
>>> e-mail-communication is for informational purposes only and is not intended
>>> as an offer or solicitation for the purchase or sale of any financial
>>> instrument or as an official confirmation of any transaction.
>>> The legal basis for the processing of your personal data is the
>>> legitimate interest to develop a commercial relationship with you, as well
>>> as your consent to forward you commercial communications. You can exercise,
>>> at any time and under the terms established under current regulation, your
>>> rights. If you prefer not to receive any further communications, please
>>> contact your client relationship manager if you are a client of Vontobel
>>> Group or notify the sender. Please note for an exact reference to the
>>> affected group entity the corporate e-mail signature. For further
>>> information about data privacy at Vontobel Group please consult
>>> www.vontobel.com.
>>> -- http://www.freelists.org/webpage/oracle-l
>>
>>

--
http://www.freelists.org/webpage/oracle-l
Received on Wed Oct 14 2020 - 21:07:35 CEST

Original text of this message