On Monday, September 14, 2020 at 3:33:14 PM UTC-7, Jason Rogers wrote:
>
> Is there a way to set connection or session parameters before executing a
> query? My use case is that I have a specific query that ends up using a
> disk merge when run, but if I set *work_mem* to some higher value (e.g.
> 50M) for this query it can do all of its work in-memory. I don't want to
> set *work_mem* that high for all queries though, which is why it's at its
> default in the server config file (4MB).
>
> I've tried using *Database::run*, *Database::execute*, and *Database::[]*
> but none of those approaches worked. E.g.
>
> ds = DB[...].where(...)
> DB[%{SET work_mem TO '50MB';#{ds.sql}}].all
>
Putting multiple queries in the same dataset is undefined behavior in
Sequel, whether it works depends on the driver.
Something like this should work:
DB.synchronize do
begin
DB.run "SET work_mem TO '50MB'"
ds.all
ensure
DB.run "SET work_mem TO '4MB'"
end
end
I would probably wrap it:
DB.dataset_extend do
def all_with_work_mem(mem)
db.synchronize do
begin
db.run "SET work_mem TO '#{mem.to_i}MB'"
all
ensure
db.run "SET work_mem TO '4MB'"
end
end
end
end
ds.all_with_work_mem(50)
Thanks,
Jeremy
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/sequel-talk/2de6aad0-85c0-4265-872e-c1205dd69be8o%40googlegroups.com.