Database connections as subprocesses Lassi Kortela (14 Sep 2019 07:30 UTC)
Re: Database connections as subprocesses John Cowan (15 Sep 2019 01:06 UTC)
Re: Database connections as subprocesses Lassi Kortela (15 Sep 2019 06:28 UTC)
Re: Database connections as subprocesses John Cowan (15 Sep 2019 23:02 UTC)
Re: Database connections as subprocesses Lassi Kortela (16 Sep 2019 08:22 UTC)
Binary S-expressions Lassi Kortela (16 Sep 2019 17:49 UTC)
(missing)
Re: Binary S-expressions Lassi Kortela (17 Sep 2019 09:46 UTC)
Re: Binary S-expressions Alaric Snell-Pym (17 Sep 2019 11:33 UTC)
Re: Binary S-expressions Lassi Kortela (17 Sep 2019 12:05 UTC)
Re: Binary S-expressions Alaric Snell-Pym (17 Sep 2019 12:23 UTC)
Re: Binary S-expressions Lassi Kortela (17 Sep 2019 13:20 UTC)
Re: Binary S-expressions Lassi Kortela (17 Sep 2019 13:48 UTC)
Re: Binary S-expressions Alaric Snell-Pym (17 Sep 2019 15:52 UTC)
Re: Binary S-expressions hga@xxxxxx (17 Sep 2019 16:25 UTC)
Re: Binary S-expressions rain1@xxxxxx (17 Sep 2019 09:28 UTC)
Re: Binary S-expressions Lassi Kortela (17 Sep 2019 10:05 UTC)
Python library for binary S-expressions Lassi Kortela (17 Sep 2019 21:51 UTC)
R7RS library for binary S-expressions Lassi Kortela (17 Sep 2019 23:56 UTC)
Re: Database connections as subprocesses Alaric Snell-Pym (16 Sep 2019 08:40 UTC)
Re: Database connections as subprocesses Lassi Kortela (16 Sep 2019 09:22 UTC)
Re: Database connections as subprocesses Alaric Snell-Pym (16 Sep 2019 11:28 UTC)
Re: Database connections as subprocesses hga@xxxxxx (16 Sep 2019 13:28 UTC)
Re: Database connections as subprocesses Lassi Kortela (16 Sep 2019 13:50 UTC)
Re: Database connections as subprocesses hga@xxxxxx (17 Sep 2019 13:59 UTC)
Re: Database connections as subprocesses John Cowan (16 Sep 2019 22:41 UTC)
Re: Database connections as subprocesses Lassi Kortela (17 Sep 2019 09:57 UTC)
Re: Database connections as subprocesses Lassi Kortela (17 Sep 2019 10:22 UTC)

Re: Database connections as subprocesses Alaric Snell-Pym 16 Sep 2019 11:27 UTC
On 16/09/2019 10:22, Lassi Kortela wrote:

[snip]
> This is exactly what I intended with the proposal :)
Ah, good!

> That's very cool, but probably also highly non-trivial to implement
> reliably.

Oh, I dunno; you can easily implement something like:

>> - StartQuery(query text) -> query ID
>> - FetchResults(query ID) -> maybe(list(record))
>> - GetMetadata(query ID) -> list(column name/type declaration)
>> - CancelQuery(query ID)

...on top of something like
https://www.postgresql.org/docs/9.5/libpq-exec.html or
https://sqlite.org/cintro.html or whatever, that have the notion of a
"result handle" returned by a function that accepts some SQL, and can be
used to fetch rows from it until there's no more. It's just a matter of
reflecting the structure of the API in the protocol :-)

>> But the key part was, you could issue a whole bunch of StartQuery
>> operations then call FetchResults on the resulting query IDs with an
>> arbitrary interleaving; each would return an arbitrarily-sized chunk of
>> records, or Nothing if the query was finished and no more records would
>> ever be returned. The ODBC client buffered those chunks as the
>> application requested a record at a time, to amortize the network round
>> trip overheads.
>
> In principle, this would likely be relatively easy to do with a
> subprocess (compared to threads and FFI). But since parallel queries are
> for high-performance situations, people might want to go with the
> pure-Scheme clients anyway. This is just speculation; since you've
> actually worked with this stuff in a production setting, feel free to
> offer counterpoints.

In our application, the only performance issues that anybody really
cared about was how fast one query could stream results back to the
client - and how quickly the first result gets back (often, clients
would do a query that would return a bazillion rows, then cancel the
query after they'd received ten) - so the "return results in pages"
thing arose out of the requirement to support that! Being able to
interleave multiple queries on one connection was mainly womething that
database APIs tend to let users do anyway (with the whole
query-function-returns-a-result-set thing) so we'd better support that
without crashing or deadlocks.

>> (What that database server did at the backend is another, fascinating,
>> story I summarised in a blog post:
>> http://www.snell-pym.org.uk/archives/2016/12/11/cool-things-i-have-worked-on-clustered-analytic-database/
>>
>> )
>
> That is some seriously impressive database wizardry.

That was the last job I had where I actually got to use the word
"algorithm" in earnest (the fun I had elbow-deep in the guts of the join
order planner!), and I miss it :-(

Thanks,

--
Alaric Snell-Pym   (M7KIT)
http://www.snell-pym.org.uk/alaric/