Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Meaning of mxlc in Oracle Trace file

I am seeing the following in my trace file:

Bind#3 oacdty=01 mxl=128(35) mxlc=36 mal=00 scl=00 pre=00
oacflg=03 fl2=1000010 frm=01 csi=31 siz=0 off=168
kxsbbbfp=ffffffff79f139a8 bln=128 avl=35 flg=01 value="1234 W 1234 West, West Groves City"

I am wondering what the mxlc value is?

like image 654
Craig Avatar asked Sep 06 '12 16:09

Craig


2 Answers

I quote

Bind #n
oacdty  - Datatype code 
mxl     - Maximum length of the bind variable value (private maximum length in parentheses)
mxlc    - Unknown    :(
mal     - array length
scl     - Scale
pre     - Precision
oacflg  - Special flag indicating bind options
fl2     - second part of oacflg
frm     - Unknown        :(
csi     - Unknown        :(
siz     - Amount of memory to be allocated for this chunk
off     - Offset into this chunk for this bind buffer
kxsbbbfp- Bind address
bln     - Bind buffer length
avl     - actual value length
flg     - bind status flag
value   - Value of the bind variable

Source (& snippet of the book)

The book also quotes-

There is currently no information on three parameters.

Which are mxlc,frm, and csi.

like image 119
AnBisw Avatar answered Oct 22 '22 02:10

AnBisw


Summary

mxlc appears to be the maximum number of characters for the bind variable, but only if the variable uses character length semantics.

Method

I searched My Oracle Support for mxlc. Almost every article has mxlc=00, the only exceptions involve an NVARCHAR or NCHAR. The code below is based on the code from Document ID 552262.1. I changed the variable sizes (99 and 123 char) around, and each time mxlc was set to the variable size if character length semantics was used.

Code

create table t1(ncol1 nvarchar2(100), col1 varchar2(100));

alter session set timed_statistics = true;
alter session set statistics_level=all;
alter session set max_dump_file_size = unlimited;
alter session set events '10046 trace name context forever,level 4';

VAR nvar1 NVARCHAR2(99)
VAR var1 VARCHAR2(123 char)
EXEC :nvar1 := 'nvarchar'
EXEC :var1 := 'varchar'

SELECT * FROM T1 WHERE ncol1 = :nvar1 and col1 = :var1;
ALTER SESSION SET EVENTS '10046 trace name context off';

Results:

 Bind#0
  oacdty=01 mxl=2000(198) mxlc=99 mal=00 scl=00 pre=00
  oacflg=03 fl2=1000010 frm=02 csi=2000 siz=4000 off=0
  kxsbbbfp=0e702edc  bln=2000  avl=16  flg=05
  value=0 6e 0 76 0 61 0 72 0 63 0 68 0 61 0 72 
 Bind#1
  oacdty=01 mxl=2000(369) mxlc=123 mal=00 scl=00 pre=00
  oacflg=03 fl2=1000010 frm=01 csi=873 siz=0 off=2000
  kxsbbbfp=0e7036ac  bln=2000  avl=07  flg=01
  value="varchar"

More Questions

Normally the relationship between mxl and mxlc makes sense. For a NVARCHAR, UTF16 on my system, there will be 2 bytes per character, thus 198 and 99. My database is UTF8, a character could take up to 4 bytes. Maybe Oracle guesses the average size will be 3 bytes, thus 123 and 369. Obviously it could be more than 369, perhaps that's just the initial memory allocated, and it can grow later?

But your numbers, 36 and 35, don't make sense to me. Surely the number of bytes can never be LESS than the number of characters? Is Oracle making a bad guess, or is some client program sending in bad data?

like image 20
Jon Heller Avatar answered Oct 22 '22 01:10

Jon Heller