320 likes | 465 Vues
This session covers the challenges of case sensitivity in IBM Informix Dynamic Server (IDS) and proposes effective solutions for handling multi-case data. It discusses the introduction of a new database property to facilitate case insensitivity in NCHAR/NVARCHAR columns, the implications for application developers, and the effects on server functionality and indices. The burdens of data migration, query performance, and how to manage data effectively are key points of this talk. Real-world examples demonstrate the proposed solutions, making it applicable for developers and database administrators.
E N D
Ajaykumar Gupte/Neeraj Kapoor Session D02 IBM Mon 4/23 10:50AM Support of Case Insensitivity in IDS Session D 02
Agenda • Problem and Background • Proposed Solution • Effect of this on IDS server functionality • Data Migration Session A14
Problem • Application developers should be cognizant of multi-case data in the database and write queries that search accordingly. • Difficult to enforce in n-tier application environment. • The queries with lower(lname) = 'mcdonald' cannot use index • Creation and use of Functional Index requires application modification • Functional index reduces performance • BTS (Basic Text Search) index supports case insensitive search, but needs application modification and has performance overhead Session A14
Informix Solution • Newly introduced Database property called insensitive/sensitive • Only NCHAR/NVARCHAR type columns will notice the effect • Create Database syntax: create database foo with log nlscase insensitive; create database foo with log nlscase sensitive; • Sysmaster:sysdatabases will have the case sensitive information about each database Session A14
Examples - 1 CREATE TABLE test (colv varchar(10); coln nvarchar(10)); INSERT INTO test VALUES('gamma', 'gamma'); INSERT INTO test VALUES('alpha', 'alpha‘); INSERT INTO test VALUES('beta', 'beta'); INSERT INTO test VALUES('epsilon', 'epsilon'); -- query varchar SELECT * FROM test WHERE colv = "GAMMA"; <0 rows returned> -- query nvarchar SELECT * FROM test WHERE coln = "GAMMA"; <1 rows returned> Session A14
Examples - 2 create table foo (cc char(5), nc nchar(5)); insert into foo values ('IBM', 'IBM'); insert into foo values ('ibm', 'ibm'); insert into foo values ('Ibm', 'Ibm'); select distinct cc from foo; cc IBM Ibm ibm 3 row(s) retrieved select distinct nc from foo; nc IBM 1 row(s) retrieved Session A14
Server functionality Effects • All the searches on NCHAR/NVARCHAR types will become case insensitive • Indexes on NCHAR/NVARCHAR columns • Fragmentation • Constraints (Primary/Referential and Check) • Aggregates , Group by, Order by and distinct Session A14
Effects (cont…) • Statistics • Casting • Cross database/Cross server Query • Dbatools/Dbaccess Session A14
Basic Case Insensitive Search create database testdb with log nlscase insensitive; create table tab1 (col1 nchar(20)); insert into tab1 values ('IBM IDS database'); insert into tab1 values ('IBM ids database'); insert into tab1 values ('ibm ids database'); insert into tab1 values ('ibm ids'); insert into tab1 values ('ibm IDS'); insert into tab1 values ('database'); Session A14
Basic Case Insensitive Search select col1 from tab1 where col1 = 'IBM IDS' ; col1 ibm ids ibm IDS select col1 from tab1 where col1 not like 'IBM IDS%' ; col1 database Session A14
Basic Case Insensitive Search • select col1 from tab1 where col1 like 'IBM IDS%'; col1 IBM IDS database IBM ids database ibm ids database ibm ids ibm IDS Session A14
Basic Case Insensitive Search select col1 from tab1 where col1 matches 'IBM*' ; col1 IBM IDS database IBM ids database ibm ids database ibm ids ibm IDS Session A14
Effect On Indexes • Unique Index create unique index uidx1 on tab1 (col1) ; 371: Cannot create unique index on column with duplicate data. 100: ISAM error: duplicate value for a record with unique key. Error in line 22 Near character position 38 • Duplicate index create index uidx1 on tab1 (col1) ; Index created. Session A14
Effect on Joins • create table t1(c1 int, c2 nchar(10)); insert into t1 values (1,"aaaaa"); insert into t1 values (2,"bbbbb"); insert into t1 values (3,"ccccc"); insert into t1 values (4,"ddddd"); • create table t2(c1 int, c2 nchar(10)); insert into t2 values (1,"AAAAA"); insert into t2 values (2,"BBBBB"); insert into t2 values (3,"CCCCC"); Session A14
Effect on Joins • select * from t1, t2 where t1.c2 = t2.c2; c1 c2 c1 c2 1 aaaaa 1 AAAAA 2 bbbbb 2 BBBBB 3 ccccc 3 CCCCC • select * from t1 left outer join t2 on t1.c2=t2.c2 where t1.c2 like 'a%'; c1 c2 c1 c2 1 aaaaa 1 AAAAA Session A14
Effect on Joins • select * from t1 left outer join t2 on t1.c2=t2.c2; c1 c2 c1 c2 1 aaaaa 1 AAAAA 2 bbbbb 2 BBBBB 3 ccccc 3 CCCCC 4 ddddd • select * from t1 left outer join t2 on (t1.c2=t2.c2 and t1.c2 like 'A%'); c1 c2 c1 c2 1 aaaaa 1 AAAAA 2 bbbbb 3 ccccc 4 ddddd Session A14
Effect on Grouping create table foo (icol int, cc char(5), nc nchar(5)); insert into foo values (1, 'IBM', 'iBM'); insert into foo values (2, 'ibm', 'ibM'); insert into foo values (3, 'ibm', 'ibM'); insert into foo values (4, 'Ibm', 'Ibm'); insert into foo values (5, 'abc', 'ABC'); insert into foo values (6, 'abc', 'ABc'); insert into foo values (7, 'abc', 'Abc'); Session A14
Effect on Grouping • select distinct nc from foo; nc Abc Ibm • select count(distinct nc) from foo; (count) 2 • select count(unique nc) from foo; (count) 2 Session A14
Effect on Grouping • select nc, count(nc) from foo group by nc order by nc; nc (count) ABC 3 iBM 4 • select nc, count(nc) from foo group by nc having max(icol) > 3 order by nc; nc (count) ABC 3 iBM 4 • select nc, count(nc) from foo group by nc having max(icol) > 5 order by nc; nc (count) ABC 3 Session A14
Effect on Constraints • create database casedb with log nlscase insensitive; • create table parent (cc char(5), nc nchar(5) primary key); • insert into parent values ('IBM', 'IBM'); • insert into parent values ('ibm', 'ibm'); 268: Unique constraint (informix.u100_1) violated. 100: ISAM error: duplicate value for a record with unique key. • insert into parent values ('Ibm', 'Ibm'); 268: Unique constraint (informix.u100_1) violated. 100: ISAM error: duplicate value for a record with unique key. Error Case Error Case Session A14
Effect on Constraints • create table child(cc1 char(5), nc1 nchar(5), foreign key(nc1) references parent(nc) ); • insert into child values ('Ibm', 'Ibm'); • insert into child values ('ibm', 'ibm'); • insert into child values ('abc', 'abc'); 691: Missing key in referenced table for referential constraint (informix.r101_2). 111: ISAM error: no record found. Should work Error Case Session A14
Effect on Constraints • update child set nc1 = 'IBM' where nc1 = 'ibm'; 2 row(s) updated. • select * from child; cc1 nc1 Ibm IBM ibm IBM Session A14
Effect on Constraints • update child set nc1 = 'ibm' where nc1 = 'IBM'; 2 row(s) updated. • select * from child; cc1 nc1 Ibm ibm ibm ibm Session A14
Effect On Fragmentation create table t1 (c1 int ,c2 nchar(20)) fragment by expression partition part_1 (c2 = 'ibm') in rootdbs, partition part_2 (c2 = 'informix') in rootdbs, partition part_3 remainder in rootdbs; insert into t1 values (1, 'IBM'); insert into t1 values (2, 'Ibm'); insert into t1 values (3, 'ibm'); insert into t1 values (1, 'INFORMIX'); insert into t1 values (2, 'Informix'); insert into t1 values (3, 'informix'); insert into t1 values (1, 'IDS'); Session A14
Effect On Fragmentation set explain on; select c2 from t1 where c2 = 'iBm'; c2 IBM Ibm ibm Explain output will show only partition part_1 was accessed Session A14
Effect On Casting create table t1 (c1 nchar(20), c2 nvarchar(20), c3 char(20), c4 varchar(20)) ; insert into t1 values ('ibm', 'ibm', 'IBM', 'IBM'); insert into t1 values ('Ibm', 'Ibm', 'IBM', 'IBM'); insert into t1 values ('IBM', 'IBM', 'IBM', 'IBM'); select c1 from t1 where c1 = 'ibm'; c1 ibm Ibm IBM NCHAR cases Session A14
Effect On Casting • select c1 from t1 where c1 = ibm'::varchar(10); c1 ibm Ibm IBM • select c1 from t1 where c1 = c3; c1 ibm Ibm IBM Compare NCHAR to CHAR Session A14
Effect On Casting select c1 from t1 where c2 = c4; c1 ibm Ibm IBM Compare NVARCHAR to VARCHAR Session A14
Effect On Casting select c1 from t1 where c3 = 'ibm'; c1 No rows found. select c1 from t1 where c3 = 'ibm'::nchar(10); c1 ibm Ibm IBM CHAR case Session A14
Data Migration • New database property, can be associated with new databases only . No conversion/reversion impact. No inplace upgrade support. • Dbexport and Dbimport can be used for migrating the case sensitive database to case insensitive databases after changing the desired columns to NCHAR/NVARCHAR types. • Dbimport will have a new command line option “-ci” for importing into Case Insensitive Database. Session A14
References • Informix 11.70 Info Center - http://publib.boulder.ibm.com/infocenter/idshelp/v117/index.jsp • DeveloperWorks CI article - http://www.ibm.com/developerworks/data/library/techarticle/dm-1108caseinsensitive/index.html?ca=drs- Session A14
Questions?!? 2/15/12 Template Presentation - Session Z99 Session A14 32