mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Take fewer snapshots.
When a PORTAL_ONE_SELECT query is executed, we can opportunistically reuse the parse/plan shot for the execution phase. This cuts down the number of snapshots per simple query from 2 to 1 for the simple protocol, and 3 to 2 for the extended protocol. Since we are only reusing a snapshot taken early in the processing of the same protocol message, the change shouldn't be user-visible, except that the remote possibility of the planning and execution snapshots being different is eliminated. Note that this change does not make it safe to assume that the parse/plan snapshot will certainly be reused; that will currently only happen if PortalStart() decides to use the PORTAL_ONE_SELECT strategy. It might be worth trying to provide some stronger guarantees here in the future, but for now we don't. Patch by me; review by Dimitri Fontaine.
This commit is contained in:
@ -1126,7 +1126,6 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan,
|
||||
CachedPlan *cplan;
|
||||
List *stmt_list;
|
||||
char *query_string;
|
||||
Snapshot snapshot;
|
||||
MemoryContext oldcontext;
|
||||
Portal portal;
|
||||
|
||||
@ -1269,15 +1268,6 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan,
|
||||
}
|
||||
}
|
||||
|
||||
/* Set up the snapshot to use. */
|
||||
if (read_only)
|
||||
snapshot = GetActiveSnapshot();
|
||||
else
|
||||
{
|
||||
CommandCounterIncrement();
|
||||
snapshot = GetTransactionSnapshot();
|
||||
}
|
||||
|
||||
/*
|
||||
* If the plan has parameters, copy them into the portal. Note that this
|
||||
* must be done after revalidating the plan, because in dynamic parameter
|
||||
@ -1293,7 +1283,13 @@ SPI_cursor_open_internal(const char *name, SPIPlanPtr plan,
|
||||
/*
|
||||
* Start portal execution.
|
||||
*/
|
||||
PortalStart(portal, paramLI, snapshot);
|
||||
if (read_only)
|
||||
PortalStart(portal, paramLI, true);
|
||||
else
|
||||
{
|
||||
CommandCounterIncrement();
|
||||
PortalStart(portal, paramLI, false);
|
||||
}
|
||||
|
||||
Assert(portal->strategy != PORTAL_MULTI_QUERY);
|
||||
|
||||
|
Reference in New Issue
Block a user