Home | Contact Us | FAQ | Search & Site Map | Link to Us
Sign In | Join | Other 45 Sites in Network
Home
Discussion Groups
Database Servers
DB2InformixIngresMS SQLOraclePervasive.SQLPostgreSQLProgressSybase
Desktop Databases
FileMakerFoxProMS AccessParadox
General
General DB TopicsDatabase Theory
Related Topics
Java Development.NET DevelopmentVB DevelopmentMore Topics ...

Database Forum / DB2 Topics / June 2006

Tip: Looking for answers? Try searching our database.

Searching View with LIKE predicate

Thread view: 
Enable EMail Alerts  Start New Thread
Thread rating: 
cjshea@gov.pe.ca - 27 Jun 2006 15:44 GMT
Hello Friends;
I am asking this as a database administrator, perhaps more on behalf of
the SQL Programmer.

We have a search on a view that uses a street number and a partial
street name in a LIKE clause.  It is a very slow, inefficient search,
pretty much unusable, and disruptive when we do use it. I believe the
view has about 200,000 records.  I will post the view code and the
select statement below, I hope that is useful, but I believe I may be
asking more "What is a good method/process for doing searches with
partial data available?, is the a proven widely used technique?"
Please tell me what to add to make this a more complete inquiry.
Thanks.  The application is websphere, the database is IBM DB2 UDB V8.2
for Linux Intel 32 bit, at fixpak 8.  Following are the view and the
select code incase it shows something glaring,  Thanks sincerely
Claude

This is the VIEW definition:

create view CCDB.BASIC_CLIENT_V as  select     CCDB.CLIENT.ID as
CLIENT_ID,   CCDB.CLIENT.CLIENT_TYPE_ID as TYPE_ID,
CCDB.CLIENT_NAME.ID as NAME_ID,   CCDB.CLIENT_NAME.NAME_TYPE_ID as
NAME_TYPE_ID,   CCDB.NAME_LIST.FIRST_NAME as FIRST_NAME,
CCDB.NAME_LIST.MID_NAME as MID_NAME,   CCDB.NAME_LIST.LAST_NAME as
LAST_NAME,   CCDB.NAME_LIST.FULL_NAME as FULL_NAME,
CCDB.NAME_LIST.GIVEN_NAMES as GIVEN_NAMES,
CCDB.CLIENT_EVENT.OCCURRED_ON AS OCCURRED_ON,  CCDB.ADDRESS.STREET_NUM
AS STREET_NUM,  CCDB.ADDRESS.STREET_NAME AS STREET_NAME,  '' AS NAME1,
'' AS NAME2,    CCDB.CLIENT_IDENTIFIER.IDENTIFIER AS CLIENT_IDENTIFIER,
CCDB.CLIENT_IDENTIFIER.IDEN_TYPE_ID AS IDENTIFIER_TYPE_DESCRIPTION,
CCDB.CLIENT_IDENTIFIER.IDEN_TYPE_ID AS IDENTIFIER_TYPE_CODE,
CCDB.CLIENT_NAME.END_DATE AS NAME_END_DATE,
       CCDB.PHONE_NUMBER.PHONE_NUMBER AS PHONE_NUMBER  FROM
CCDB.CLIENT_PHONE RIGHT OUTER JOIN CCDB.CLIENT ON
CCDB.CLIENT_PHONE.CLIENT_ID = CCDB.CLIENT.ID                 LEFT JOIN
CCDB.PHONE_NUMBER ON CCDB.CLIENT_PHONE.PHONE_ID = CCDB.PHONE_NUMBER.ID,
                                      CCDB.CLIENT_EVENT,
CCDB.CLIENT_IDENTIFIER,              CCDB.CLIENT_TYPE,
CCDB.CLIENT_NAME,              CCDB.NAME_LIST,
CCDB.CLIENT_ADDRESS,           CCDB.ADDRESS    WHERE
CCDB.CLIENT_TYPE.ID = CCDB.CLIENT.CLIENT_TYPE_ID   AND ( CCDB.CLIENT.ID
= CCDB.CLIENT_EVENT.CLIENT_ID   )   and ( CCDB.CLIENT.ID =
CCDB.CLIENT_IDENTIFIER.CLIENT_ID   )   and ( CCDB.CLIENT.ID =
CCDB.CLIENT_NAME.CLIENT_ID  )   and ( CCDB.CLIENT.ID =
CCDB.CLIENT_ADDRESS.CLIENT_ID  )   AND 2 = CCDB.CLIENT_TYPE.ID  AND 1 =
CCDB.CLIENT_ADDRESS.ADDRESS_TYPE_ID  AND 1 =
CCDB.CLIENT_IDENTIFIER.IDEN_TYPE_ID    AND 1 =
CCDB.CLIENT_EVENT.EVENT_TYPE_ID   AND ( CCDB.ADDRESS.ID =
CCDB.CLIENT_ADDRESS.ADDRESS_ID  )     AND  (
CCDB.CLIENT_ADDRESS.END_DATE > CURRENT DATE OR
CCDB.CLIENT_ADDRESS.END_DATE IS NULL)    AND  (
CCDB.CLIENT_EVENT.END_DATE > CURRENT DATE OR CCDB.CLIENT_EVENT.END_DATE
IS NULL)   AND  ( CCDB.CLIENT_IDENTIFIER.END_DATE > CURRENT DATE OR
CCDB.CLIENT_IDENTIFIER.END_DATE IS NULL)     and (
CCDB.CLIENT_NAME.NAME_ID = CCDB.NAME_LIST.ID   )   AND (
CCDB.CLIENT_NAME.NAME_TYPE_ID in (1,2))  AND  (
CCDB.CLIENT_NAME.END_DATE > CURRENT DATE OR CCDB.CLIENT_NAME.END_DATE
IS NULL)

Here is the where portion of the select statement that is paining us,
it is a SELECT DISTINCT bunch of fields from the view
WHERE BASIC_CLIENT_V.STREET_NUM='15' AND BASIC_CLIENT_V.STREET_NAME
LIKE 'MACKINNON%' ORDER BY UPPER(BASIC_CLIENT_V.LAST_NAME) ASC,
UPPER(BASIC_CLIENT_V.FIRST_NAME) ASC, UPPER(BASIC_CLIENT_V.MID_NAME) ASC
Serge Rielau - 27 Jun 2006 15:56 GMT
> Hello Friends;
> I am asking this as a database administrator, perhaps more on behalf of
[quoted text clipped - 60 lines]
> LIKE 'MACKINNON%' ORDER BY UPPER(BASIC_CLIENT_V.LAST_NAME) ASC,
> UPPER(BASIC_CLIENT_V.FIRST_NAME) ASC, UPPER(BASIC_CLIENT_V.MID_NAME) ASC

There is nothing inherently bad about the sort of LIKE processing you
are doing. DB2 will add a BETWEEN predicate to limit the search.
How does your explain (db2exfmt) look like?

Cheers
Serge

Signature

Serge Rielau
DB2 Solutions Development
IBM Toronto Lab

IOD Conference
http://www.ibm.com/software/data/ondemandbusiness/conf2006/

cjshea@gov.pe.ca - 28 Jun 2006 13:01 GMT
Serge;
Thank you for the rapid response, and the re-assurance that this is an
ok way to code.  A few minutes ago we found that an index on address
table had been dropped somehow, we put it back and now our searches are
like lightening. Learning the tools as I go, getting better every day.
I appreciate your input

Claude

> > Hello Friends;
> > I am asking this as a database administrator, perhaps more on behalf of
[quoted text clipped - 75 lines]
> IOD Conference
> http://www.ibm.com/software/data/ondemandbusiness/conf2006/
 
Sign In
Join
My Latest Posts
My Monitored Threads
My Blog
My Photo Gallery
My Profile
My Homepage

Start New Thread
Enable EMail Alerts
Rate this Thread



©2009 Advenet LLC   Privacy Policy - Terms of Use
This website includes both content owned or controlled by Advenet as well as content owned or controlled by third parties.