mirror of
https://github.com/postgres/postgres.git
synced 2025-11-29 23:43:17 +03:00
Be more tense about not creating tuplestores with randomAccess = true unless
backwards scan could actually happen. In particular, pass a flag to materialize-mode SRFs that tells them whether they need to require random access. In passing, also suppress unneeded backward-scan overhead for a Portal's holdStore tuplestore. Per my proposal about reducing I/O costs for tuplestores.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
$PostgreSQL: pgsql/src/backend/utils/fmgr/README,v 1.14 2008/10/28 22:02:05 tgl Exp $
|
||||
$PostgreSQL: pgsql/src/backend/utils/fmgr/README,v 1.15 2008/10/29 00:00:38 tgl Exp $
|
||||
|
||||
Function Manager
|
||||
================
|
||||
@@ -432,6 +432,10 @@ function is called in). The function stores pointers to the Tuplestore and
|
||||
TupleDesc into ReturnSetInfo, sets returnMode to indicate materialize mode,
|
||||
and returns null. isDone is not used and should be left at ExprSingleResult.
|
||||
|
||||
The Tuplestore must be created with randomAccess = true if
|
||||
SFRM_Materialize_Random is set in allowedModes, but it can (and preferably
|
||||
should) be created with randomAccess = false if not.
|
||||
|
||||
If available, the expected tuple descriptor is passed in ReturnSetInfo;
|
||||
in other contexts the expectedDesc field will be NULL. The function need
|
||||
not pay attention to expectedDesc, but it may be useful in special cases.
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.111 2008/07/18 20:26:06 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/utils/mmgr/portalmem.c,v 1.112 2008/10/29 00:00:38 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -354,11 +354,17 @@ PortalCreateHoldStore(Portal portal)
|
||||
ALLOCSET_DEFAULT_INITSIZE,
|
||||
ALLOCSET_DEFAULT_MAXSIZE);
|
||||
|
||||
/* Create the tuple store, selecting cross-transaction temp files. */
|
||||
/*
|
||||
* Create the tuple store, selecting cross-transaction temp files, and
|
||||
* enabling random access only if cursor requires scrolling.
|
||||
*
|
||||
* XXX: Should maintenance_work_mem be used for the portal size?
|
||||
*/
|
||||
oldcxt = MemoryContextSwitchTo(portal->holdContext);
|
||||
|
||||
/* XXX: Should maintenance_work_mem be used for the portal size? */
|
||||
portal->holdStore = tuplestore_begin_heap(true, true, work_mem);
|
||||
portal->holdStore =
|
||||
tuplestore_begin_heap(portal->cursorOptions & CURSOR_OPT_SCROLL,
|
||||
true, work_mem);
|
||||
|
||||
MemoryContextSwitchTo(oldcxt);
|
||||
}
|
||||
@@ -913,7 +919,9 @@ pg_cursor(PG_FUNCTION_ARGS)
|
||||
* We put all the tuples into a tuplestore in one scan of the hashtable.
|
||||
* This avoids any issue of the hashtable possibly changing between calls.
|
||||
*/
|
||||
tupstore = tuplestore_begin_heap(true, false, work_mem);
|
||||
tupstore =
|
||||
tuplestore_begin_heap(rsinfo->allowedModes & SFRM_Materialize_Random,
|
||||
false, work_mem);
|
||||
|
||||
hash_seq_init(&hash_seq, PortalHashTable);
|
||||
while ((hentry = hash_seq_search(&hash_seq)) != NULL)
|
||||
|
||||
Reference in New Issue
Block a user