Hey Dennis,

I've pretty much eliminated subselects from inserts and updates by 
correlating the tables, but I have not figured out how to replace 
"NOT in (.....)". How would a person do that?

Thanks

Ben Petersen



On 5 Mar 2004 at 10:27, Dennis McGrath wrote:

> I frequently use DISTINCT in subselects to speed up processing
> 
> 
> SELECT ... WHERE colname IN ( SELECT DISTINCT colname FROM .....)
> 
> Try your queries with and without the DISTINCT.
> 
> 
> Updates benefit even more, often reducing the time drasticly.
> UPDATE ... WHERE colname IN ( SELECT DISTINCT colname FROM .....)
> 
> Dennis McGrath
> 
> 
> --- Jim Limburg <[EMAIL PROTECTED]> wrote:
> > Thank You Mr R:>
> > 
> > This is a real good lesson. I see how this would be more effective.
> > Now if I can get some of our db's more normalized and
> > setup to utiilize this it will be a great benefit.
> > 
> > Again. Thank You
> > Jim Limburg
> > 
> > A. Razzak Memon wrote:
> > 
> > > At 01:17 PM 3/3/2004 -0500, Jim Limburg wrote:
> > >
> > >> I have a question about this that you wrote:
> > >>
> > >> 08. Use correlated sub-selects or multi-table selects instead
> > >> --  of sub-selects
> > >>
> > >> A multi-table select uses indexes to join the tables. A correlated
> > >> sub-select uses indexes to restrict the list of values to be
> > >> compared within the sub-select. A plain sub-select will not use
> > >> indexes. Each row of data from the main query must be compared to
> > >> every row selected by the sub-select.
> > >>
> > >> My question is basically along the lines of not understanding the
> > >> above comment. Please remember those of us more SQL challenged
> > >> individuals. When you say plain sub-select, do you mean something
> > >> like this SELECT * FROM ITEMS WHERE custnum IN (SELECT custnum
> > from
> > >> SPECIALORDERS WHERE custnum contains '1234').
> > >> Now, does a corrlated sub-select use the T1, T2 type interface?
> > >>
> > >> Just wanting to learn.
> > >
> > >
> > >
> > > Jim,
> > >
> > > To illustrate, compare the results obtained by using the different
> > > techniques on two tables, each with 1,000 unique rows (each row in
> > > Table1 has only one match in Table2).
> > >
> > > (1) A multi-table select, shown below, took 00:05.
> > >
> > >     SELECT collist FROM table1,table2 +
> > >     WHERE Table1.LinkCol = Table2.LinkCol
> > >
> > > (2) A correlated sub-select, which looked at every row in Table1
> > >     but needed to look at only one row in Table2 for each row in
> > >     Table1, takes less than 00:10. The example is shown below:
> > >
> > >     SELECT collist FROM Table1 WHERE LinkCol IN +
> > >     (SELECT LinkCol FROM Table2 WHERE
> > Table2.LinkCol=Table1.LinkCol)
> > >
> > > (3) A plain sub-select, which had to look for a match in every row
> > >     in Table2 for each of the 1,000 rows of Table1, will take more
> > >     than 00:10. (three times, maybe..) to complete. This example,
> > >     by far the slowest, is shown below:
> > >
> > >     SELECT collist FROM Table1 WHERE LinkCol IN +
> > >     (SELECT LinkCol FROM Table2)
> > >
> > > SELECT is a command in which your data really affects the
> > performance.
> > > The results you see and the method you find best will depend on the
> > > number of rows and distribution of data in the tables you are
> > combining.
> > >
> > > You should try those techniques in your real time database and see
> > what
> > > you find.
> > >
> > > Hope that helps!
> > >
> > > Very Best R:egards,
> > >
> > > Razzak.
> > >
> > >
> > > A. Razzak Memon wrote:
> > >
> > >>> At 03:48 PM 3/2/2004 -0800, Victor Timmons wrote:
> > >>>
> > >>>> I would like some tips on how to speedup rbase when it
> > >>>> running on a network.
> > >>>
> > >>>
> > >>> Victor,
> > >>>
> > >>> Here are a few more tips in addition to the suggestions
> > >>> posted earlier by fellow R:BASE users/developers:
> > >>>
> > >>> -- 
> > >>> 01. Use the most current version of R:BASE
> > >>> --  (I know you are using the latest & greatest version!)
> > >>>
> > >>> R:BASE Technologies is continually making speed improvements,
> > >>> and each new release is faster than the previous one. For
> > >>> example, building indexes in R:BASE 6.5/7.x is significantly
> > >>> faster than in previous versions.
> > >>>
> > >>> You can even PACK the INDEXes faster in 6.5++, even in a
> > >>> Multi-User environment.
> > >>>
> > >>>         PACK INDEX
> > >>>         or
> > >>>         PACK INDEX FOR TableName
> > >>>
> > >>> -- 
> > >>> 02. Think globally instead of row by row
> > >>> -- 
> > >>> This is one of the best ways to achieve some significant speed
> > >>> improvements. Instead of doing row-by-row processing using a
> > >>> DECLARE CURSOR, try using a single UPDATE or INSERT command,
> > >>> which will take advantage of the SQL select capabilities of
> > >>> R:BASE.
> > >>>
> > >>> For example, suppose you want to create a table to hold
> > >>> information about how many of each product a customer has
> > >>> purchased. The most logical approach is to set up a cursor
> > >>> to go through the detail table and count the rows for each
> > >>> customer/product combination and then insert that data into
> > >>> the new table. On a table with 3500 rows, processing all
> > >>> the rows may take few minutes. By replacing the DECLARE
> > >>> CURSOR loop with a single insert command, the time required
> > >>> to process all the rows may take 75% less.
> > >>>
> > >>> Compare the two pieces of code:
> > >>>
> > >>> DECLARE c1 CURSOR FOR SELECT CustID,PartNo FROM CPProdDet +
> > >>> GROUP BY CustID,PartNo
> > >>>  OPEN c1
> > >>>    FETCH c1 INTO +
> > >>>    vCustID INDIC ivCustID, +
> > >>>    vPartNo INDIC ivPartNo
> > >>>      WHILE SQLCODE < > 100 THEN
> > >>>        SELECT COUNT(*) INTO vCount FROM CPProdDet WHERE +
> > >>>         CustID = .vCustID AND PartNo =.vPartNo
> > >>>        INSERT INTO CustProd (CustID,PartNo,Copies) VALUES +
> > >>>        (.vCustID,.vPartNo,.vCount)
> > >>>        FETCH c1 INTO +
> > >>>        vCustID INDIC ivCustID, +
> > >>>        vPartNo INDIC ivPartNo
> > >>>      ENDWHILE
> > >>>      DROP CURSOR c1
> > >>>
> > >>>      vs.
> > >>>
> > >>>      INSERT INTO CustProd (CustID,PartNo,Copies) +
> > >>>      SELECT CustID,PartNo,Count(*) +
> > >>>      FROM CPProdDet GROUP BY CustID,PartNo
> > >>>
> > >>> -- 
> > >>> 03. Be Creative
> > >>> -- 
> > >>> R:BASE almost always offers two or more ways of doing something.
> > >>> Look for an alternative method for accomplishing a task - it
> > >>> might just be considerably faster.
> > >>>
> > >>> -- 
> > >>> 04. Change the environment
> > >>> -- 
> > >>> The R:BASE environment settings that have the most effect on
> > >>> performance are SET MESSAGES.
> > >>>
> > >>> SET MESSAGES OFF eliminates the time required for screen display
> > >>> of messages. This is particularly noticeable if you are doing
> > >>> repetitive UPDATE or INSERT commands.
> > >>>
> > >>> -- 
> > >>> 05. Reduce Number of Expressions in Reports
> > >>> -- 
> > >>> Because all report expressions are processed for each row of
> > >>> data read from the reports driving table or view, reducing the
> > >>> number of expressions in a report increases the printing speed
> > >>> of a report.
> > >>>
> > >>> -- 
> > >>> 06. Abbreviate commands to four characters
> > >>> -- 
> > >>> R:BASE parses command lines into 4-byte tokens - the fewer
> > >>> tokens to read, the faster the command executes.
> > >>>
> > >>> -- 
> > >>> 07. Combine commands whenever possible
> > >>> -- 
> > >>> Many R:BASE commands allow access to more than one column or
> > >>> variable and don't require using separate commands for each.
> > >>> This reduces the number of times R:BASE must parse and read a
> > >>> command. The fewer commands to read, the faster R:BASE executes.
> > >>>
> > >>> -- 
> > >>> 08. Use correlated sub-selects or multi-table selects instead
> > >>> --  of sub-selects
> > >>>
> > >>> A multi-table select uses indexes to join the tables. A
> > correlated
> > >>> sub-select uses indexes to restrict the list of values to be
> > >>> compared within the sub-select. A plain sub-select will not use
> > >>> indexes. Each row of data from the main query must be compared to
> > 
> === message truncated ===
> 

Reply via email to