]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the query planner, add a heuristic that will reduce the cost of a full
authordrh <>
Thu, 1 Sep 2022 10:41:24 +0000 (10:41 +0000)
committerdrh <>
Thu, 1 Sep 2022 10:41:24 +0000 (10:41 +0000)
table scan for a materialized view or subquery if the full scan is the
outer-most loop.  This is shown to speed up some queries.

FossilOrigin-Name: e3754cc18824aad4113ad6d81e33e5c763beb9705fc6af88d8f8c870a03c731d

manifest
manifest.uuid
src/where.c
src/whereInt.h
test/selectC.test
test/window1.test
test/with3.test

index 455ca1e2927acb482edcc3b1cb98ff7018439055..7113b8ffd728ec71dcfcbed8ec07ffab2c150695 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Merge\sthe\sbranch-3.28a\sfixes\sinto\sbranch-3.28.
-D 2022-08-10T17:03:43.321
+C In\sthe\squery\splanner,\sadd\sa\sheuristic\sthat\swill\sreduce\sthe\scost\sof\sa\sfull\ntable\sscan\sfor\sa\smaterialized\sview\sor\ssubquery\sif\sthe\sfull\sscan\sis\sthe\nouter-most\sloop.\s\sThis\sis\sshown\sto\sspeed\sup\ssome\squeries.
+D 2022-09-01T10:41:24.845
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -604,8 +604,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
 F src/wal.c 9eccc7ebb532a7b0fd3cabc16cff576b9afa763472272db67d84fb8cec96f5c0
 F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
 F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4
-F src/where.c c2a2fcf7fd0d9ff00f09e51ba797a8a73387f424c7a7a96093201a7bad64a249
-F src/whereInt.h bcbba483d0cd72c17ab9af97061dce3c00eb3695cd17a5d41cdfec2cb5a6e8ce
+F src/where.c 742ced4550d1df8d683482b11f2432bb60a93f6f50b532ba9c3a32720fc3b78e
+F src/whereInt.h ffebbbad9359cc602c9cbb24d926f73fc1bf696f0edb4ff896afa32018aad690
 F src/wherecode.c 5e0b6dec8591e13f1f0af828d350e4a5dd2e3518b63d328f21bb38e2456dfeb7
 F src/whereexpr.c 90859652920f153d2c03f075488744be2926625ebd36911bcbcb17d0d29c891c
 F src/window.c 038c248267e74ff70a2bb9b1884d40fd145c5183b017823ecb6cbb14bc781478
@@ -1278,7 +1278,7 @@ F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d
 F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95
 F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4
 F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25
-F test/selectC.test e25243f8ca503e06f252eb0218976d07cfeceac3
+F test/selectC.test 2bbed4310ec03acfa7487c2536beeeb706b0a8d05e85a711290c95fa9eaf3063
 F test/selectD.test fc20452847a01775710090383cfb4423275d2f745fed61f34fbf37573ac0d214
 F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf
 F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3
@@ -1684,7 +1684,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
 F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
-F test/window1.test 2a692388f8919bbe70676136e4c969ab8aa6af83bbd327b46cb58a7f6fb23202
+F test/window1.test 0410dd5c7dd971d03c6706c0fad5903a45bb87c2ff1d61f10ba395a6179e0aa2
 F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143
 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
 F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03
@@ -1702,7 +1702,7 @@ F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9
 F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898
 F test/with1.test a07b5aad7f77acdf13e52e8814ea94606fcc72e9ea4c99baf293e9d7c63940be
 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab
-F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c
+F test/with3.test e76a354523a17233830f0d98cc63379cf7ebeb07354a0aff027d892451f44ba3
 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64
 F test/without_rowid1.test b5ec93f7df2c1d684e0923247dac6aca8888e088bf50a9f244c3933e0e813a72
@@ -1819,9 +1819,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 68d86f2b20ffa815f9f6bc1b402969ce76651a50e5b6f47daa8b6c8f5e696f52 d2e672203704aa18fdc652e9567eb29b71dae32e871f514308478a7a96025f29
-R 88ef982e5e56f20bd999e4280ab176a8
-T +closed d2e672203704aa18fdc652e9567eb29b71dae32e871f514308478a7a96025f29
+P ba6bf331476d0217f4132b73cb3da559e75bfb21856ec94f82c0f0150a53592b
+Q +609fbb94b8f01d6792e5941ab23ce041313d359f6788c4dde6b1ca749ab49137
+R 7b7f582c65e5dee0ef3f194b93a7fa92
 U drh
-Z ec095a6c54b68c4641d9afdfd01f70d2
+Z e7f00c4ae02183e078488febebe7b6ef
 # Remove this line to create a well-formed Fossil manifest.
index 8121bd1a686b77b5d28a7d9b56179fc66b3f2cb8..3f4b0c049aa9ff12723f27370b69832b47dedd08 100644 (file)
@@ -1 +1 @@
-ba6bf331476d0217f4132b73cb3da559e75bfb21856ec94f82c0f0150a53592b
\ No newline at end of file
+e3754cc18824aad4113ad6d81e33e5c763beb9705fc6af88d8f8c870a03c731d
\ No newline at end of file
index 288f510eb17cc53a4c9dc25dcf7cfe6821f6623f..abe29279befdaf6c312e586ec4af8fb2df3370c1 100644 (file)
@@ -3014,6 +3014,9 @@ static int whereLoopAddBtree(
 #else
       pNew->rRun = rSize + 16;
 #endif
+      if( (pTab->tabFlags & TF_Ephemeral)!=0 ){
+        pNew->wsFlags |= WHERE_VIEWSCAN;
+      }
       ApplyCostMultiplier(pNew->rRun, pTab->costMult);
       whereLoopOutputAdjust(pWC, pNew, rSize);
       rc = whereLoopInsert(pBuilder, pNew);
@@ -4162,6 +4165,13 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){
           rUnsorted -= 2;  /* TUNING:  Slight bias in favor of no-sort plans */
         }
 
+        /* TUNING:  A full-scan of a VIEW or subquery in the outer loop
+        ** is not so bad. */
+        if( iLoop==0 && (pWLoop->wsFlags & WHERE_VIEWSCAN)!=0 ){
+          rCost += -10;
+          nOut += -30;
+        }
+
         /* Check to see if pWLoop should be added to the set of
         ** mxChoice best-so-far paths.
         **
index 69342b79a6c04649312319992beaa4694478732e..ca87134c045b63a5bdfd0bba9ca3cac50d0a013a 100644 (file)
@@ -587,3 +587,4 @@ void sqlite3WhereTabFuncArgs(Parse*, struct SrcList_item*, WhereClause*);
 #define WHERE_PARTIALIDX   0x00020000  /* The automatic index is partial */
 #define WHERE_IN_EARLYOUT  0x00040000  /* Perhaps quit IN loops early */
 #define WHERE_IN_SEEKSCAN  0x00100000  /* Seek-scan optimization for IN */
+#define WHERE_VIEWSCAN     0x02000000  /* A full-scan of a VIEW or subquery */
index 4d7996300745a89bd6d91de6dedc9300a59f2626..667b8f3f213879ee698ecea7087c045af892d24f 100644 (file)
@@ -261,10 +261,10 @@ do_execsql_test 5.2 {
 }
 
 do_execsql_test 5.3 {
-  SELECT * FROM x1, (SELECT b FROM vvv UNION ALL SELECT c from x3);
+  SELECT * FROM x1, (SELECT b FROM vvv UNION ALL SELECT c from x3)
 } {
-  a 21 a 22 a 23 a 24 a 25 a 302 a 303 a 301
-  b 21 b 22 b 23 b 24 b 25 b 302 b 303 b 301
+  a 21 b 21 a 22 b 22 a 23 b 23 a 24 b 24 a 25 b 25
+  a 302 b 302 a 303 b 303 a 301 b 301
 }
 
 finish_test
index 0242e43d18b2717ef5a84c28c2f55871e9f10fbc..db6814f7ac624e0b9cb1a1701e4bc2b4dce66b25 100644 (file)
@@ -212,10 +212,11 @@ do_execsql_test 6.1 {
 } {1 1 2 2 3 3 4 4 5 5 6 6 7 7}
 
 do_execsql_test 6.2 {
-  SELECT * FROM t2, (SELECT x, count(*) OVER (ORDER BY x) FROM t1);
+  SELECT * FROM t2, (SELECT x, count(*) OVER (ORDER BY x) FROM t1)
+  ORDER BY 1, 2;
 } {
-  b 1 1 b 2 2 b 3 3 b 4 4 b 5 5 b 6 6 b 7 7
   a 1 1 a 2 2 a 3 3 a 4 4 a 5 5 a 6 6 a 7 7
+  b 1 1 b 2 2 b 3 3 b 4 4 b 5 5 b 6 6 b 7 7
 }
 
 do_catchsql_test 6.3 {
index 0f49f0685903b49854a1ba44c5c21d530f0d0e9a..91bb8f016cbfa189827e49eb1d6b640118f72c9e 100644 (file)
@@ -123,8 +123,8 @@ do_eqp_test 3.2.2 {
   |  |  `--SCALAR SUBQUERY xxxxxx
   |  |     `--SCAN TABLE w2
   |  `--RECURSIVE STEP
-  |     |--SCAN TABLE w1
-  |     `--SCAN TABLE c
+  |     |--SCAN TABLE c
+  |     `--SCAN TABLE w1
   |--SCAN SUBQUERY xxxxxx
   |--SEARCH TABLE w2 USING INTEGER PRIMARY KEY (rowid=?)
   `--SEARCH TABLE w1 USING INTEGER PRIMARY KEY (rowid=?)