Unicode Oddity
from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID NAME LENGTH(NAME) BLENGTH(NAME) Cona¿ová,d 10 12
Insert 10 characters in 11 bytes CREATE TABLE fred (fred10 VARCHAR2(11)); Table created. INSERT INTO fred SELECT name FROM ps_personal_data WHERE emplid = '007'; ERROR at line 1: ORA-01401: inserted value too large for column
Insert 10 characters in 12 bytes CREATE TABLE fred (fred10 VARCHAR2(12)); Table created. INSERT INTO fred SELECT name FROM ps_personal_data WHERE emplid = '007'; 1 row created.
How does PeopleSoft create tables? CREATE TABLE fred (fred10 VARCHAR2(30) CHECK (LENGTH(fred10)<=10) ); Table created.
So... Length checking constraint on EVERY character column in the database! >500,000 user constraints What effect does this have on performance
Experiment 1 create table test_nocons (id number,field_01 varchar2(30) …,field_20 varchar2(30) ); create table test_cons (id number,field_01 varchar2(30) CHECK(LENGTH(field_01)<=30 ) …,field_20 varchar2(30) CHECK(LENGTH(field_01)<=30 ) );
Populate tables, trace enabled alter session set sql_trace = true; BEGIN FOR i IN LOOP INSERT INTO test_nocons VALUES (i,RPAD(TO_CHAR(i),11,'.') …,RPAD(TO_CHAR(i),30,'.') ); COMMIT; END LOOP; END; /
Results of Experiment 1 Insert rows CPU time for recursive SQL on my 500Mhz Laptop –No constraints: 11.08s –With constraints13.23s
Experiment 2 Now deliberately generate different SQL statements, forcing parse every time. BEGIN FOR i IN LOOP EXECUTE IMMEDIATE 'INSERT INTO test_nocons VALUES ('||i||',RPAD(TO_CHAR('||i||'),11,''.''))'; END LOOP; COMMIT; END; /
Results of Experiment 2 >99% parse time Duration of parse CPU –Without Constraints: 41.05s –With Constraints: s
Conclusion Execution of constraints adds overhead. –On my PC 15%-20% increase in CPU consumption. If you have much SQL parsing this will aggravate the problem. In my case 4 times worse.
Unicode Oddity David Kurtz Go-Faster Consultancy Ltd.