From: drh <> Date: Tue, 11 Feb 2025 16:00:52 +0000 (+0000) Subject: Attempt to improvement performance of multiple OP_Columns that occur in a row. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Fcolumn-optimization;p=thirdparty%2Fsqlite.git Attempt to improvement performance of multiple OP_Columns that occur in a row. Minimal improvement for a lot of complexity and risk. FossilOrigin-Name: 53478f29347c7f17d46ec2a1e7c390c9be9e9fc32f31da77a4ba7a9d67440a8e --- diff --git a/manifest b/manifest index 68312e890c..859d9812de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\spointless\sline\sof\scode. -D 2025-02-10T19:48:13.176 +C Attempt\sto\simprovement\sperformance\sof\smultiple\sOP_Columns\sthat\soccur\sin\sa\srow.\nMinimal\simprovement\sfor\sa\slot\sof\scomplexity\sand\srisk. +D 2025-02-11T16:00:52.467 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -849,7 +849,7 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba F src/util.c 9ff6470dabcf943fd796d2da766c98bd328c8f6fe036a31e5b338e628603f989 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 -F src/vdbe.c b98d86de7f0e6c02fb14e0e1ae8feab6aa84669d389771a848e23f59eb70dcad +F src/vdbe.c eeb0882a45918150d9576f5bbcaa255689082e70cc9abf82287439bc39440edf F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091 F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86 @@ -2209,8 +2209,12 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6b9007cb30257ca97de74dec1df47f46f238f034083517a51c24334e4bd30663 -R 6d33e5e79434d78cc0854681af5e3875 +P 57b2b812c8c5524f315e20cee0e6a12a3b1635aeb42925bf891532a7029d0eb0 +R 5b40ead92f50e29d43d44519f8927a47 +T *branch * column-optimization +T *sym-column-optimization * +T +closed * +T -sym-trunk * U drh -Z 4cd996db652c357ad0cb2f7e1b69e405 +Z 359be1e71666f10555b25682f42340bf # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 862aaf2925..b4aacdb2c2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57b2b812c8c5524f315e20cee0e6a12a3b1635aeb42925bf891532a7029d0eb0 +53478f29347c7f17d46ec2a1e7c390c9be9e9fc32f31da77a4ba7a9d67440a8e diff --git a/src/vdbe.c b/src/vdbe.c index ec871c5a6e..f6aefeea1a 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3055,6 +3055,7 @@ op_column_restart: goto op_column_restart; } +op_column_again: /* Make sure at least the first p2+1 entries of the header have been ** parsed and valid information is in aOffset[] and pC->aType[]. */ @@ -3210,6 +3211,30 @@ op_column_restart: } } + /* Try to save work if two or more OP_Columns against the same + ** cursor occur one right after another. + ** + ** This optimization saves CPU cycles when it applies. But it is + ** not applicable very often. So we often burn more CPU cycles + ** determining whether or not the optimization does apply than the + ** optimization actually saves, depending on the workload. Even + ** when there is a net gain, it is not that much. + ** + ** This change (and this comment) are saved for future reference. + ** But unless some further improvement is found, it does not seem + ** worth the added complexity. + */ + if( pOp[1].opcode==OP_Column + && pC==p->apCsr[pOp[1].p1] + ){ + UPDATE_MAX_BLOBSIZE(pDest); + REGISTER_TRACE(pOp->p3, pDest); + pOp++; + nVmStep++; + p2 = (u32)pOp->p2; + goto op_column_again; + } + op_column_out: UPDATE_MAX_BLOBSIZE(pDest); REGISTER_TRACE(pOp->p3, pDest);