Plateforme Level Extreme
Abonnement
Profil corporatif
Produits & Services
Support
Légal
English
No Rushmore on Varchar Fields?
Message
 
 
À
Tous
Information générale
Forum:
Visual FoxPro
Catégorie:
Base de données, Tables, Vues, Index et syntaxe SQL
Titre:
No Rushmore on Varchar Fields?
Versions des environnements
Visual FoxPro:
VFP 9
OS:
Windows 2000 SP4
Database:
Visual FoxPro
Divers
Thread ID:
01021536
Message ID:
01021536
Vues:
69
Can anyone see why Rushmore optimization is NONE on the following demo code? When EXACT is off, I get a "cartesian product" message for Rushmore. This happens when joining 2 tables on a fields that are varchar data types. Note that I am alernately using the = or == in the SQL commands. This looks like a potential bug to me.
#DEFINE MAX_RECORDS 50000
IF NOT DIRECTORY('vartest')
   MD vartest
ENDIF
CLOSE TABLES all
CD VarTest
ERASE vtable?.dbf
ERASE vtable?.cdx
CREATE TABLE vtable1 (keyid I, item_no v(10), descript v(30))
CREATE TABLE vtable2 (keyid I, item_no v(10))
SELECT vtable1
INDEX on keyid TAG keyid
INDEX on item_no TAG item_no
SELECT vtable2
INDEX on keyid TAG keyid
INDEX on item_no TAG item_no
lnChildRecs = MAX_RECORDS/100
FOR lnI = 1 TO MAX_RECORDS
   lcItem = TRANSFORM(201000 + lnI)
   lcDesc = 'Item description #' + TRANSFORM(lnI)
   INSERT INTO vtable1 VALUES (lnI, lcItem, lcDesc)
   IF MOD(lnI, lnChildRecs) = 0
      INSERT INTO vtable2 VALUES (lnI/lnChildRecs, lcItem)
   ENDIF
ENDFOR
CLOSE TABLES all
SYS(3054, 11)
CLEAR
lcOldExact = SET("Exact")
SET EXACT OFF
?
? '*** SET EXACT = OFF ***'
?
? 'Begin slow retrieval (uses single = in the join)... '
?
lnStart = SECONDS()
SELECT vtable1.*, vtable2.keyid as table2_id ;
   FROM vtable1 JOIN vtable2 ON vtable1.item_no = vtable2.item_no ;
   INTO CURSOR crsResults
?
? 'Elapsed time:', SECONDS() - lnStart
?
?
CLOSE TABLES all
? 'Begin fast retrieval (uses "==" in the join)... '
?
lnStart = SECONDS()
SELECT vtable1.*, vtable2.keyid as table2_id ;
   FROM vtable1 JOIN vtable2 ON vtable1.item_no == vtable2.item_no ;
   INTO CURSOR crsResults
?
? 'Elapsed time:', SECONDS() - lnStart
?
?
?
CLOSE TABLES all
SET EXACT ON
? '*** SET EXACT = ON ***'
?
? 'Begin slow retrieval (uses single = in the join)... '
?
lnStart = SECONDS()
SELECT vtable1.*, vtable2.keyid as table2_id ;
   FROM vtable1 JOIN vtable2 ON vtable1.item_no = vtable2.item_no ;
   INTO CURSOR crsResults
?
? 'Elapsed time:', SECONDS() - lnStart
?
?
CLOSE TABLES all
? 'Begin fast retrieval (uses "==" in the join)... '
?
lnStart = SECONDS()
SELECT vtable1.*, vtable2.keyid as table2_id ;
   FROM vtable1 JOIN vtable2 ON vtable1.item_no == vtable2.item_no ;
   INTO CURSOR crsResults
?
? 'Elapsed time:', SECONDS() - lnStart
?
CLOSE TABLES all
CD ..
SET EXACT &lcOldExact
Mark McCasland
Midlothian, TX USA
Suivant
Répondre
Fil
Voir

Click here to load this message in the networking platform