Yeah, that's just wrong. The query should take 1 second or less.

Index matches only work if the expression of the index is IDENTICAL to
the expression used in the left side of a WHERE clause.

ALLTRIM does not work in indexes, as VFP indexes have to have the same length.

It's a BEST Practice to not create complex expressions, like stringing
fields together, in order to match records in two tables, as it's
harder to ensure all of those expressions are Rushmore-optimizable.

So, assuming you have separate index tags for each field (dDate,
cName, cType, etc.) on both of the tables, and also a separate tag for
DELETED() on each table, and none of the indexes have "FOR" clauses,
since they won't be used in Rushmore optimization.

Assuming you have a primary key on the receipts table the query is
easy. If you don't,... well, it's a lot tougher.

  SELECT *;
    FROM Receipts;
Where Receipts.PrimaryKey NOT IN
(SELECT Receipts.PrimaryKey
 FROM Receipts JOIN Master
 ON
  Receipts.dDate = Master.dDate AND
  Receipts.cName = Master.cName AND
  Receipts.cType = Master.cType AND
  Receipts.nAmount = Master.nAmount AND
  Receipts.cAccount = Master.cAccount AND
  Receipts.cClass = Master.cClass AND
  Receipts.cJobCust = Master.cJobCust AND
  Receipts.cNumber = Master.cNumber AND
  Receipts.mMemo = Master.mMemo AND
  Receipts.cSplit_id = Master.cSplit_id
 )
     INTO CURSOR Batch READWRITE

should work in subsecond time with 1350 records.

On Sun, May 15, 2016 at 4:05 PM, Joe Yoder <j...@wheypower.com> wrote:
> I have a process that starts out with a table of about 4300 records.  An
> SQL select yields a cursor of only the records not already in a master
> table for processing and gradual addition to the master table.  When the
> master table was empty my SQL results were sub second.  Now that the master
> table has about 1350 records in it the SQL process takes between 15 and 16
> seconds.  My initial thought was that indexing each field in the master
> table should speed things up but that seems to have no effect.
>
> Here is the code:
> * Build a cursor of all records from the Receipts table that are not in the
> Master table
>   SELECT *;
>     FROM Receipts;
>     WHERE (DTOC(dDate);
>       + ALLTRIM(cName);
>       + ALLTRIM(cType);
>       + ALLTRIM(STR(nAmount,10,2));
>       + ALLTRIM(cAccount);
>       + ALLTRIM(cClass);
>       + ALLTRIM(cJobCust);
>       + ALLTRIM(cNumber);
>       + ALLTRIMm(Memo);
>              + cSplit_id;
>    NOT in;
>       (select DTOC(dDate);
>          + ALLTRIM(cName);
>          + ALLTRIM(cType);
>          + ALLTRIM(STR(nAmount,10,2));
>          + ALLTRIM(cAccount);
>          + ALLTRIM(cClass);
>          + ALLTRIM(cJobCust);
>          + ALLTRIM(cNumber);
>          + ALLTRIM(mMemo);
>                  + cSplit_id;
>      FROM Master));
>      INTO CURSOR Batch READWRITE
>
> Suggestions welcome!
>
> Thanks in advance,
>
> Joe
>
>
> --- StripMime Report -- processed MIME parts ---
> multipart/alternative
>   text/plain (text body -- kept)
>   text/html
> ---
>
[excessive quoting removed by server]

_______________________________________________
Post Messages to: ProFox@leafe.com
Subscription Maintenance: http://mail.leafe.com/mailman/listinfo/profox
OT-free version of this list: http://mail.leafe.com/mailman/listinfo/profoxtech
Searchable Archive: http://leafe.com/archives/search/profox
This message: 
http://leafe.com/archives/byMID/profox/CACW6n4t+owB9foXqZX+Ttw1FHS+kh+v2wW7cBQ6S7zT=s9q...@mail.gmail.com
** All postings, unless explicitly stated otherwise, are the opinions of the 
author, and do not constitute legal or medical advice. This statement is added 
to the messages for those lawyers who are too stupid to see the obvious.

Reply via email to