SYS_OP_C2C internal function, implicit data type converstion
March 15, 2017 Leave a comment
Our database is heavily loaded. In addition, developers are writing codes that make even Exadata to hang đ  They are the best hackers ever :):)
Investigating database performance using 13c Cloud Control found one very interesting SQL.
At glance everything is fine, but there is one thing that is important and makes SQL Â heavy.
Top SQL:
SELECT nvl(max(bl.id), 0) FROM schemaname.eb_restriction_balance bl WHERE bl.restrictcode = :b1
SCHEMANAME.EB_RESTRICTION_BALANCE table structure:
SQL> DESC schemaname.eb_restriction_balance Name Type Nullable Default Comments -------------- ------------ -------- ------- -------- ID NUMBER RESTRICTCODE VARCHAR2(30) CURRENCY VARCHAR2(3) RESTRICTAMOUNT NUMBER(14) 0 BALANCE NUMBER(14) 0 STATE NUMBER(5) 5 INSERTDATE DATE sysdate UPDATEDATE DATE Y INN VARCHAR2(30) Y
RESTRICTCODE column is indexed.
So in ideal way the above select should use the index on RESTRICTCODE.
Cloud Control shows that CBO chooses TABLE ACCESS STORAGE FULL.
You can run SQL Tuning Advisor from Cloud Control easily. Advisor generated the following recommendation:
The execution plan of this statement can be improved by creating one or more indices. | Consider running the Access Advisor to improve the physical schema design or creating the recommended index.schemaname.EB_RESTRICTION_BALANCE(SYS_OP_C2C(“RESTRICTCODE”)) |
SYS_OP_C2C means that there happened implicit data type conversion.
So we must find the exact bind value that was used at the time sql was run.
SQL> SELECT name, datatype_string, value_string 2 FROM v$sql_bind_capture 3 WHERE sql_id='dnb1771sbm98x'; NAME DATATYPE_STRING VALUE_STRING ------- ------------------ ------------- :B1 NVARCHAR2(128) BR16215493 :B1 NVARCHAR2(128) BR16213680
As you see bind value type was NVARCHAR, that is why oracle converted varchar2 to nvarchar2 and did not use index on RESTRICTCODE.
Solution is to make developer change code and pass the parameter with the type varchar2.