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.

Reply via email to