unicode oddity. from a unicode peoplesoft database select emplid, name, length(name), blength(name)...

13
Unicode Oddity

Upload: eleanor-gregory

Post on 30-Dec-2015

212 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

Unicode Oddity

Page 2: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

from a Unicode PeopleSoft Database

SELECT emplid, name, LENGTH(name), BLENGTH(name)FROM ps_personal_dataWHERE emplid = '007’;

EMPLID NAME LENGTH(NAME) BLENGTH(NAME)------------- ---------- ------------ -------------007 Cona¿ová,d 10 12

Page 3: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

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

Page 4: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

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.

Page 5: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

How does PeopleSoft create tables?

CREATE TABLE fred (fred10 VARCHAR2(30) CHECK (LENGTH(fred10)<=10));Table created.

Page 6: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

So...

• Length checking constraint on EVERY character column in the database!

• >500,000 user constraints

• What effect does this have on performance

Page 7: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

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)

);

Page 8: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

Populate tables, trace enabled

alter session set sql_trace = true;BEGIN FOR i IN 1..10000 LOOP INSERT INTO test_nocons VALUES

(i,RPAD(TO_CHAR(i),11,'.')

…,RPAD(TO_CHAR(i),30,'.'));

COMMIT; END LOOP;END;/

Page 9: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

Results of Experiment 1

• Insert 10000 rows

• CPU time for recursive SQL • on my 500Mhz Laptop

– No constraints: 11.08s– With constraints 13.23s

Page 10: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

Experiment 2

• Now deliberately generate different SQL statements, forcing parse every time.

BEGIN FOR i IN 1..1000 LOOP EXECUTE IMMEDIATE 'INSERT INTO test_nocons VALUES ('||

i||',RPAD(TO_CHAR('||i||'),11,''.''))'; END LOOP; COMMIT;END;/

Page 11: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

Results of Experiment 2

• >99% parse time

• Duration of parse CPU– Without Constraints: 41.05s– With Constraints: 156.93s

Page 12: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

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.

Page 13: Unicode Oddity. from a Unicode PeopleSoft Database SELECT emplid, name, LENGTH(name), BLENGTH(name) FROMps_personal_data WHEREemplid = '007’ ; EMPLID

Unicode OddityDavid Kurtz

Go-Faster Consultancy Ltd.

[email protected]

www.go-faster.co.uk