 |
|
Oracle Case insensitive index searches
Don Burleson
|
For more details on tuning Oracle with indexes, see my book
"Oracle
Tuning: The Definitive Reference".
There are several techniques to write case insensitive SQL that avoids index invalidation and unnecessary
full-table scans. You can also employ
Oracle text indexes to remove full-table scans when using the
LIKE operator. Prior to Oracle10g release 2 case insensitive
queries required special planning:
1 - Transform data in the query to make it case insensitive (note
that this can invalidate indexes without a function-based index):
create index upper_full_name on
customer ( upper(full_name));
select full_name from customer
where upper(full_name) = 'DON BURLESON';
2 - Use a trigger to transform the data to make it case
insensitive (or store the data with the to_lower or
to_upper BIF.
3 - Use Alter session commands:
alter session set NLS_COMP=ANSI;
alter session set NLS_SORT=GENERIC_BASELETTER;
select * from customer where full_name = 'Don Burleson'
Oracle 10g release 2 has now introduced a case insensitive search
method using BINARY_CI and BINARY_AI sorts.
In Oracle10g release 2 we see this new approach to case insensitive
searches. (This example is derived from Tom Kyte's Oracle OpenWorld 2004 presentation on
Oracle10g release 2 new features)
Initialization parameters:
NLS_SORT=binary_ci
NLS_COMP=ansi
Sample index create:
create index
caseless_name_index
on
customer
(
nlssort( full_name, 'NLS_SORT=BINARY_CI')
);
alter session set nls_sort=binary_ci;
select * from customer where full_name = 'Don Burleson';
|
|
Get the Complete
Oracle SQL Tuning Information
The landmark book
"Advanced Oracle
SQL Tuning The Definitive Reference" is
filled with valuable information on Oracle SQL Tuning.
This book includes scripts and tools to hypercharge Oracle 11g
performance and you can
buy it
for 30% off directly from the publisher.
|
|