× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



You should be able to use the INNER JOIN to get the best performance.
If it is performing poorly I would look to see what indexes it is trying
to use to get the data.

If you cannot use the normal joins think about using temp tables instead
of the IN.  Like you said there is no way for you to control the
execution plan.  With tables you can add indexes and provide hints to
which hints it should use.  

Don't rely on the database to know how it should look for data.  
I have had this happen many times

Select t1.pk from t1 inner join t2 on t1.fk = t2.pk
When the engine would scan t1 it would use the pk index instead of the
fk index.  Tell the compile to use the fk index makes a big difference.

HTH

Gregory Jones


-----Original Message-----
From: java400-l-bounces+gtjones=fpic.net@xxxxxxxxxxxx
[mailto:java400-l-bounces+gtjones=fpic.net@xxxxxxxxxxxx] On Behalf Of
NGay@xxxxxxxxxxxxx
Sent: Thursday, January 26, 2006 12:30 PM
To: java400-l@xxxxxxxxxxxx
Subject: Re: JDBC - Setting Values on PreparedStatement

Joe,

We've had real issues in the past precisely because of this though - we
have an application that, in a nutshell, allows clients to look only at
information on their own account numbers.  Any client may have 1..n
account
numbers, so the SQL statement is similar to

select * from sometable where account in (439,482,509)

For whatever reason, presumably something to do with the varying number
of
account numbers, the query optimizer sometimes chooses to execute these
kinds of queries in one way (which performs well) or another (which
performs terribly) (which I've proved by looking at the logs for how the
SQL was executed using STRDBMON), and we've no direct control over the
decisions that the query optimizer takes.

At least if we could just prepare

select * from sometable where account in (?)

and then do something similar to:
int [] accounts = new int [3];
accounts [0] = 439; accounts [1] = 482; accounts [2] = 509;
PreparedStatement ps = conn.prepareStatement ("select * from sometable
where account in (?)");
ps.setArray (1, accounts);

then although we'd still have no direct control over the query
optimizer,
we'd stand a chance that all clients would behave similarly (& so have
similar performance).  I notice there is a .setArray method so did some
googling on this, it seems this is a java.sql.Array type, which it is up
to
JDBC vendors to implement (or not - it is optional).  Is it implemented
in
the iSeries JDBC driver?


Incentally, yes I also tried linking to the table that holds the
accounts
for the client, similar to:
select * from sometable join clientaccounts on clientaccounts.account =
sometable.account where client = ?
and this just performs awfully for everyone so its not an option.

Best regards,

Nigel Gay.




 

             "Joe Sam Shirah"

             <jshirah@attgloba

             l.net>
To 
             Sent by:                  "Java Programming on and around
the 
             java400-l-bounces         iSeries / AS400"

             @midrange.com             <java400-l@xxxxxxxxxxxx>

 
cc 
 

             26/01/2006 13:14
Subject 
                                       Re: JDBC - Setting Values on

                                       PreparedStatement

             Please respond to

             Java Programming

             on and around the

              iSeries / AS400

             <java400-l@midran

                  ge.com>

 

 






    Hi James,

    While there often are additional reasons to use prepared statements,
the
primary idea is that a search plan can be created beforehand and reused
in
later queries.  The benefit comes from not having to recalc the plan
each
time, which is the case with standard Statements.  While the comparison
*values* of variables can vary using replacement markers, it's pretty
much
an implicit requirement that the variables themselves don't change.  If
they
do, clearly another plan has to be devised, which pretty much defeats
the
advantage.

    If you ignore possible other considerations, then perforrmance-wise
a
standard Statement will beat out a PreparedStatement in a one-time use.
That's becasue a PreparedStatement requires a separate trip to the
database
so the database engine can get the information and prepare the plan.

    There's no substantive difference in Sarah's solution and building
the
appropriate statement with replacement markers ( question marks - ? ) as
you
need it.  Whether it makes sense performance-wise to do either one
depends
on whether the statement will be executed multiple times.

    A relatively new impact is that some drivers/databases are capable
of
caching prepared statements, so in a multi-user environment, like
servlets,
you may still get a performance gain overall even though an individual
response/thread uses it only once.  HTH,


                                                         Joe Sam

Joe Sam Shirah -        http://www.conceptgo.com
conceptGO       -        Consulting/Development/Outsourcing
Java Filter Forum:       http://www.ibm.com/developerworks/java/
Just the JDBC FAQs: http://www.jguru.com/faq/JDBC
Going International?    http://www.jguru.com/faq/I18N
Que Java400?            http://www.jguru.com/faq/Java400


----- Original Message -----
From: "James O'Sullivan" <josulli4@xxxxxxx>
To: "Java Programming on and around the iSeries / AS400"
<java400-l@xxxxxxxxxxxx>
Sent: Thursday, January 26, 2006 10:57 AM
Subject: Re: JDBC - Setting Values on PreparedStatement


>
> Thanks Sarah,
>       I was hopeful that it could be done using the ?, but good to
have
> this option.
>
> regards
>
>
> James O'Sullivan
> Senior Technical Consultant
> email: josulli4@xxxxxxx
> Office: +44 1252 536681
> Fax: +44 1252 534022
> www: www.csc.com
> Based at: Tower 2, Floor 2, Royal Pavilion, Wellesley Road, Aldershot,
> Hampshire, GU11 1PZ
>
> CSC Corporation Limited: No. 1812179.
> All registered office addresses: Royal Pavilion, Wellesley Road,
Aldershot,
> Hampshire, GU11 1PZ. Registered in England.
>
>
>
>
>              Sarah Poger
>              Gladstone
>              <listmember@glads
To
>              tone.info>                Java Programming on and around
the
>              Sent by:                  iSeries / AS400
>              java400-l-bounces         <java400-l@xxxxxxxxxxxx>
>              @midrange.com
cc
>
>
Subject
>              26/01/2006 15:12          Re: JDBC - Setting Values on
>                                        PreparedStatement
>
>              Please respond to
>              Java Programming
>              on and around the
>               iSeries / AS400
>              <java400-l@midran
>                   ge.com>
>
>
> I had to do something similar where I didn't know in advance how many
> variables would be in the IN clause.
>
> How I solved my issue was to not use ? in my prepared statement.
>
> For example:
>
> String langs = "'" + lang1 + "' , "  + "'" + lang2 + "'";
> PreparedStatement pstmt = con.prepareStatement("SELECT * FROM ERORPF
WHERE
> ERORLANG IN (" + langs + ")"  );
>
> HTH,
> Sarah
>
>
> On 1/26/06, James O'Sullivan <josulli4@xxxxxxx> wrote:
> >
> >
> >
> >
> > Hi All,
> >      I have had a tour around the Net and can't seem to find an
> > answer/example of this.
> >
> > Have a simple SQL statement
> > SELECT * FROM ERORPF WHERE ERORLANG IN ('E', 'N', 'D')
> > The contents of the IN predicate can vary from 1 to 10 items, hence
my
> > question.
> >
> > I set this in a PreparedStatement
> >
> > PreparedStatement pstmt = con.prepareStatement("SELECT * FROM ERORPF
> WHERE
> > ERORLANG IN (?)");
> >
> > But when it came to replacing the ? with the required values, I hit
my
> > problem.
> > I tried (perhaps optimistically) just to see if it would accept
> parameters
> > in the following format, but no joy.
> >
> > String langs = "'" + lang1 + "' , "  + "'" + lang2 + "'";
> > setString(1, langs);
> >
> > How can you pass a variable amount of values to the IN predicate?
> >
> >
> > regards
> >
> >
> > James O'Sullivan

--
This is the Java Programming on and around the iSeries / AS400
(JAVA400-L)
mailing list
To post a message email: JAVA400-L@xxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: http://lists.midrange.com/mailman/listinfo/java400-l
or email: JAVA400-L-request@xxxxxxxxxxxx
Before posting, please take a moment to review the archives
at http://archive.midrange.com/java400-l.





************************************************************************
********
The information in this message is confidential and may be legally
privileged. It is intended solely for the addressee; access to this
email by anyone else is unauthorised.

If you are not the intended recipient: (1) you are kindly requested
to return a copy of this message to the sender indicating that you
have received it in error, and to destroy the received copy; and (2)
any disclosure or distribution of this message, as well as any action
taken or omitted to be taken in reliance on its content, is prohibited
and may be unlawful.
************************************************************************
********


As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.