Message
 
 
To
25/09/2006 16:20:09
General information
Fórum:
Visual FoxPro
Category:
Bases de dados, Tabelas, Views, Indices e SQL
Environment versions
Visual FoxPro:
VFP 9 SP1
OS:
Windows XP
Database:
Visual FoxPro
Miscellaneous
ID da thread:
01156530
ID da mensagem:
01157220
Views:
20
>Yes, VFP merge the two and condition and build a "In fly temp index of the 400k records"
>
>ON TI.cTrans_fk = X.cTrans_pk AND TI.iSequence_Number = X.iSequence
>
>become
>
>ON BINTOC(TI.cTrans_fk)+BINTOC(TI.iSequence_Number) = BINTOC(X.cTrans_pk)+BINTOC(X.iSequence_Number)
>
>
>this is a bug into the query optimizer.
>
>we now have to deceive the VFP engine
>
>
>* try 1 : same ?
>SELECT TI.cTrans_fk, TI.cInsurances_fk;
>    FROM (select curTemp.cTrans_pk , max(T.iSequence_Number) iSequence_Number;
>    	from curTemp JOIN Trans_Insurances T ON curTemp.cTrans_pk = T.cTrans_fk ;
>	    GROUP BY 1) X ;
>	    JOIN Trans_Insurances TI ;
>            ON TI.cTrans_fk = X.cTrans_pk ;
>        WHERE TI.iSequence_Number = X.iSequence_Number;
>into cursor curTemp1

Time: 3.554
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table t: none
Joining intermediate result and table t using index tag Ctrans_fk
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table ti: none
Joining intermediate result and table ti using temp index


>* try 2 : error ?
>SELECT TI.cTrans_fk, TI.cInsurances_fk;
>    FROM (select curTemp.cTrans_pk , max(T.iSequence_Number) iSequence_Number;
>    	from curTemp JOIN Trans_Insurances T ON curTemp.cTrans_pk = T.cTrans_fk ;
>	    GROUP BY 1) X ;
>	    JOIN Trans_Insurances TI ;
>            ON TI.cTrans_fk = X.cTrans_pk ;
>        HAVING TI.iSequence_Number = X.iSequence_Number;
>into cursor curTemp1
>

Time: 0.046
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table t: none
Joining intermediate result and table t using index tag Ctrans_fk
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table ti: none
Joining intermediate result and table ti using index tag Ctrans_fk

Looks like a winner!!!!!!!!!!!!

>* try 3 : can to go in error if (cTrans_fk ,iSequence_Number) is not unique
>SELECT TI.cTrans_fk;
>  , (SELECT TI.cInsurances_fk FROM Trans_Insurances TI ;
>         WHERE TI.cTrans_fk = X.cTrans_pk AND TI.iSequence_Number = X.iSequence_Number);
>    cInsurances_fk;
>    FROM (select curTemp.cTrans_pk , max(T.iSequence_Number) iSequence_Number;
>    	from curTemp JOIN Trans_Insurances T ON curTemp.cTrans_pk = T.cTrans_fk ;
>	    GROUP BY 1) X ;
>into cursor curTemp1
>

Gives an error alias TI is not found.

>* try 4
>SELECT TI.cTrans_fk, TI.cInsurances_fk;
>    FROM (select curTemp.cTrans_pk , max(T.iSequence_Number) iSequence_Number;
>    	from curTemp JOIN Trans_Insurances T ON curTemp.cTrans_pk = T.cTrans_fk ;
>	    GROUP BY 1) X ;
>	    LEFT JOIN Trans_Insurances TI ;
>            ON TI.cTrans_fk = X.cTrans_pk ;
>        WHERE TI.iSequence_Number = X.iSequence_Number;
>into cursor curTemp1
>
>
Time: 0.053
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table t: none
Joining intermediate result and table t using index tag Ctrans_fk
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table ti: none
Joining intermediate result and table ti using index tag Ctrans_fk

Looks like a winner too.


>* try 5
>SELECT TI.cTrans_fk, TI.cInsurances_fk;
>    FROM (select curTemp.cTrans_pk , max(T.iSequence_Number) iSequence_Number;
>    	from curTemp JOIN Trans_Insurances T ON curTemp.cTrans_pk = T.cTrans_fk ;
>	    GROUP BY 1) X ;
>	    JOIN Trans_Insurances TI ;
>            ON TI.cTrans_fk = X.cTrans_pk and INLIST(X.iSequence_Number,TI.iSequence_Number) ;
>into cursor curTemp1
>
Time: 0.061
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table t: none
Joining intermediate result and table t using index tag Ctrans_fk
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table ti: none
Joining intermediate result and table ti using index tag Ctrans_fk

So, basically, 2,4,5 gave result in less than 0.1 sec. I think, I'll go with 2.

Thanks a lot, Fabio.

(I haven't re-started between tries, so this may affect the result...)
If it's not broken, fix it until it is.


My Blog
Previous
Next
Responder
Mapa
View