When using an index to scan a database table, read column data from the index in preference to the table. This increases the likelihood that the table will not be required at all. (CVS 4580)

FossilOrigin-Name: 061608c72ac0a96eacf3b64d638235e4739f96ba
This commit is contained in:
danielk1977
2007-11-29 17:43:27 +00:00
parent 9a96b66810
commit 21de2e755c
5 changed files with 30 additions and 28 deletions
+8 -8
View File
@@ -1,5 +1,5 @@
C Optimisations\sfor\sexpressions\sof\sthe\sform\s"<value>\sIN\s(SELECT\s<column>\sFROM\s<table>)".\s(CVS\s4579)
D 2007-11-29T17:05:18
C When\susing\san\sindex\sto\sscan\sa\sdatabase\stable,\sread\scolumn\sdata\sfrom\sthe\sindex\sin\spreference\sto\sthe\stable.\sThis\sincreases\sthe\slikelihood\sthat\sthe\stable\swill\snot\sbe\srequired\sat\sall.\s(CVS\s4580)
D 2007-11-29T17:43:28
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in 35396fd58890420b29edcf27b6c0e2d054862a6b
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -176,7 +176,7 @@ F src/vdbeblob.c 82f51cdf9b0c0af729732fde48c824e498c0a1ca
F src/vdbefifo.c 334c838c8f42d61a94813d136019ee566b5dc2f6
F src/vdbemem.c 123994fcd344993d2fb050a83b91b341bbbd08b4
F src/vtab.c f819d55ef638d45e09ce00009d435da8bf16f528
F src/where.c a03cd9da865f9ae9d750b01b45ad0bd82bd456f1
F src/where.c 7ec7c7a5b3a534d5ccbe9d73690b8969ee6b3f08
F tclinstaller.tcl 4356d9d94d2b5ed5e68f9f0c80c4df3048dd7617
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/all.test ee350b9ab15b175fc0a8fb51bf2141ed3a3b9cba
@@ -336,7 +336,7 @@ F test/insert3.test 9a4ef3526fd3cca8b05278020ec3100448b4c677
F test/insert4.test 6919ddacd79c2cfeb9785b0f84217f9cb14853b5
F test/insert5.test e8d5ba31283db5b0315ada9774dd99b6e9fe2122
F test/interrupt.test 81555fb0f8179bb2d0dc7151fd75428223f93cf2
F test/intpkey.test af4fd826c4784ec5c93b444de07adea0254d0d30
F test/intpkey.test 537669fd535f62632ca64828e435b9e54e8d677f
F test/io.test 80a7a7f1a2792e037d447b03e8c22ee1f6eaf339
F test/ioerr.test ae429185a3a11a318aa7ec64e2188e6119e43bca
F test/ioerr2.test e3d52c40f43f9b61da9b38951a737e7b84ebae96
@@ -509,7 +509,7 @@ F test/vtabA.test 9cb6b1afead6fdd91bbdf1ca65c44ccfd9b10936
F test/vtab_alter.test b0c0f61a9588b509c2ba20dedc2db04999da6656
F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8
F test/vtab_shared.test d631d1f820c38c18939d53aab1fc35db5f0a8094
F test/where.test 1bcde8984c63747ac6d6bafcacd20fd6e8a223de
F test/where.test 5ff4a1bda6352b73354faf1a97706bbfa0d47dfe
F test/where2.test 9bbf1cc675730954047d663e4c0dc5d4c9669ca4
F test/where3.test 0a30fe9808b0fa01c46d0fcf4fac0bf6cf75bb30
F test/where4.test 1b1cd72d5f205ce34d5a31f3c4918f833e5e6a63
@@ -594,7 +594,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
P 221aee72be040769e8026b91648f03c6366a8821
R 17bc1550023a2d1b2bcf36adaf1ceda3
P 56d0e32677744df8570b519fae1c04da4ea4984d
R 36e691e0ba7fd3d68c366765c689ffb2
U danielk1977
Z 90a3ecb3d9566cd903183cf31905697c
Z 64a9f02b9181db1b1e3b35c33464441d
+1 -1
View File
@@ -1 +1 @@
56d0e32677744df8570b519fae1c04da4ea4984d
061608c72ac0a96eacf3b64d638235e4739f96ba
+12 -10
View File
@@ -16,7 +16,7 @@
** so is applicable. Because this module is responsible for selecting
** indices, you might also think of this module as the "query optimizer".
**
** $Id: where.c,v 1.264 2007/11/29 17:05:18 danielk1977 Exp $
** $Id: where.c,v 1.265 2007/11/29 17:43:28 danielk1977 Exp $
*/
#include "sqliteInt.h"
@@ -2215,10 +2215,6 @@ WhereInfo *sqlite3WhereBegin(
VdbeComment((v, "# %s", pIx->zName));
sqlite3VdbeOp3(v, OP_OpenRead, iIdxCur, pIx->tnum,
(char*)pKey, P3_KEYINFO_HANDOFF);
}
if( (pLevel->flags & (WHERE_IDX_ONLY|WHERE_COLUMN_RANGE))!=0 ){
/* Only call OP_SetNumColumns on the index if we might later use
** OP_Column on the index. */
sqlite3VdbeAddOp(v, OP_SetNumColumns, iIdxCur, pIx->nColumn+1);
}
sqlite3CodeVerifySchema(pParse, iDb);
@@ -2742,8 +2738,12 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
sqlite3VdbeAddOp(v, OP_Close, pLevel->iIdxCur, 0);
}
/* Make cursor substitutions for cases where we want to use
** just the index and never reference the table.
/* If this scan uses an index, make code substitutions to read data
** from the index in preference to the table. Sometimes, this means
** the table need never be read from. This is a performance boost,
** as the vdbe level waits until the table is read before actually
** seeking the table cursor to the record corresponding to the current
** position in the index.
**
** Calls to the code generator in between sqlite3WhereBegin and
** sqlite3WhereEnd will have created code that references the table
@@ -2751,10 +2751,11 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
** that reference the table and converts them into opcodes that
** reference the index.
*/
if( pLevel->flags & WHERE_IDX_ONLY ){
if( pLevel->pIdx ){
int k, j, last;
VdbeOp *pOp;
Index *pIdx = pLevel->pIdx;
int useIndexOnly = pLevel->flags & WHERE_IDX_ONLY;
assert( pIdx!=0 );
pOp = sqlite3VdbeGetOp(v, pWInfo->iTop);
@@ -2762,17 +2763,18 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){
for(k=pWInfo->iTop; k<last; k++, pOp++){
if( pOp->p1!=pLevel->iTabCur ) continue;
if( pOp->opcode==OP_Column ){
pOp->p1 = pLevel->iIdxCur;
for(j=0; j<pIdx->nColumn; j++){
if( pOp->p2==pIdx->aiColumn[j] ){
pOp->p2 = j;
pOp->p1 = pLevel->iIdxCur;
break;
}
}
assert(!useIndexOnly || j<pIdx->nColumn);
}else if( pOp->opcode==OP_Rowid ){
pOp->p1 = pLevel->iIdxCur;
pOp->opcode = OP_IdxRowid;
}else if( pOp->opcode==OP_NullRow ){
}else if( pOp->opcode==OP_NullRow && useIndexOnly ){
pOp->opcode = OP_Noop;
}
}
+2 -2
View File
@@ -13,7 +13,7 @@
# This file implements tests for the special processing associated
# with INTEGER PRIMARY KEY columns.
#
# $Id: intpkey.test,v 1.23 2005/07/21 03:48:20 drh Exp $
# $Id: intpkey.test,v 1.24 2007/11/29 17:43:28 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -293,7 +293,7 @@ do_test intpkey-3.8 {
count {
SELECT * FROM t1 WHERE c=='world' AND a>7;
}
} {11 hello world 5}
} {11 hello world 4}
do_test intpkey-3.9 {
count {
SELECT * FROM t1 WHERE 7<a;
+7 -7
View File
@@ -1,4 +1,4 @@
# 2001 September 15
# 4 2001 September 15
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
@@ -11,7 +11,7 @@
# This file implements regression tests for SQLite library. The
# focus of this file is testing the use of indices in WHERE clases.
#
# $Id: where.test,v 1.43 2007/06/25 16:29:34 danielk1977 Exp $
# $Id: where.test,v 1.44 2007/11/29 17:43:28 danielk1977 Exp $
set testdir [file dirname $argv0]
source $testdir/tester.tcl
@@ -184,7 +184,7 @@ do_test where-1.25 {
do_test where-1.27 {
count {SELECT w FROM t1 WHERE x=3 AND y+1==122}
} {10 17}
} {10 10}
do_test where-1.28 {
count {SELECT w FROM t1 WHERE x+1=4 AND y+1==122}
@@ -358,7 +358,7 @@ ifcapable subquery {
count {
SELECT * FROM t1 WHERE rowid+0 IN (1,2,3,1234) order by 1;
}
} {1 0 4 2 1 9 3 1 16 199}
} {1 0 4 2 1 9 3 1 16 102}
do_test where-5.3 {
count {
SELECT * FROM t1 WHERE w IN (-1,1,2,3) order by 1;
@@ -368,7 +368,7 @@ ifcapable subquery {
count {
SELECT * FROM t1 WHERE w+0 IN (-1,1,2,3) order by 1;
}
} {1 0 4 2 1 9 3 1 16 199}
} {1 0 4 2 1 9 3 1 16 102}
do_test where-5.5 {
count {
SELECT * FROM t1 WHERE rowid IN
@@ -382,7 +382,7 @@ ifcapable subquery {
(select rowid from t1 where rowid IN (-1,2,4))
ORDER BY 1;
}
} {2 1 9 4 2 25 201}
} {2 1 9 4 2 25 103}
do_test where-5.7 {
count {
SELECT * FROM t1 WHERE w IN
@@ -396,7 +396,7 @@ ifcapable subquery {
(select rowid from t1 where rowid IN (-1,2,4))
ORDER BY 1;
}
} {2 1 9 4 2 25 201}
} {2 1 9 4 2 25 103}
do_test where-5.9 {
count {
SELECT * FROM t1 WHERE x IN (1,7) ORDER BY 1;