Re: Postgres delays function returning large set of data - Mailing list pgsql-hackers
| From | flippo00110001 |
|---|---|
| Subject | Re: Postgres delays function returning large set of data |
| Date | |
| Msg-id | 23891972.post@talk.nabble.com Whole thread Raw |
| In response to | Re: Postgres delays function returning large set of data (Pavel Stehule <pavel.stehule@gmail.com>) |
| Responses |
Re: Postgres delays function returning large set of data
|
| List | pgsql-hackers |
Pavel Stehule wrote:
>
> Hello
>
> can you send source code? There are two types of C SRF functions. One
> returns row ro by row, second store returned rows and returns block.
> What did you use?
>
I had originally used the style that returns row by row, but after reading
the page i created a new function which returns a block. This version runs
slightly faster (12.5 seconds to run my test case) but it is still far
slower than expected.
A few notes on the code:
getdata function returns an array with length 2*size, the first size
elements are one colum the other size elements are the next column.
I have timed the call getdata and determined it consumes on average around
30ms of my test case's run time.
<code>
PG_FUNCTION_INFO_V1(getTableFastHDF5);
Datum
getTableFastHDF5(PG_FUNCTION_ARGS)
{ /*{{{*//* Locals */ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;FuncCallContext *fcc;TupleDesc
tupdesc;Tuplestorestate*tupstore;MemoryContext per_query_ctx;MemoryContext oldcontext;AttInMetadata *attinmeta;int
*data;intsize;int i;
if (!connections) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("No
connections open, use openHDF5 to open a file first")));
data = getdata(textToStr(PG_GETARG_TEXT_P(0)), PG_GETARG_INT32(1),
PG_GETARG_INT32(2), &size, TEMPORARY_CONTEXT);
per_query_ctx = rsinfo->econtext->ecxt_per_query_memory;oldcontext = MemoryContextSwitchTo(per_query_ctx);
tupdesc = rsinfo->expectedDesc;tupstore = tuplestore_begin_heap(true, false, SortMem);
if (data == NULL) ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), errmsg("Could not
find specified data in file")));
for (i = 0; i < size; i++){ /*{{{*/ Datum val[2]; bool nulls[2]; HeapTuple tup;
MemoryContextSwitchTo(oldcontext);
MemSet(nulls, false, 2 * sizeof(bool));
/* fill strings to be turned into tuple */ val[0] = Int32GetDatum(data[i]); val[1] = Int32GetDatum(data[i +
size]);
/* make tuple */ tup = heap_form_tuple(tupdesc, val, nulls);
/* make tuple to datum so it can be returned */ MemoryContextSwitchTo(per_query_ctx);
tuplestore_puttuple(tupstore,tup);
/* return, but there is more to send */ /*}}}*/}/* return and finish sending */
tuplestore_donestoring(tupstore);
MemoryContextSwitchTo(oldcontext);
rsinfo->returnMode = SFRM_Materialize;rsinfo->setResult = tupstore;rsinfo->setDesc = tupdesc;
return (Datum) 0;
/*}}}*/
}
</code>
--
View this message in context:
http://www.nabble.com/Postgres-delays-function-returning-large-set-of-data-tp23853886p23891972.html
Sent from the PostgreSQL - hackers mailing list archive at Nabble.com.
pgsql-hackers by date: