> On 24 Feb 2026, at 16:57, Andrei Lepikhov <[email protected]> wrote:
> 
> On 24/2/26 16:50, Attila Soki wrote:
>> Now with join_collapse_limit=7 works for me and I am not able to flip the 
>> plan. makes that sense?
> 
> It is almost a game of chance. But if it solves your problem - why not ;)?
> 
>> should I still test with increased statistic on table_k.dp_end_dat as 
>> Laurenz suggested?
> 
> Yes, it may provide us additional info for developing.
ok i try that and come with more info.
Should I set join_collapse_limit back to default for this test?

> 
>> I could now share some general infos about the query, if you still 
>> interested.
> Yes, we still have a problem. So, any additional info that can let us build a 
> repro is appreciated.


The query involves many tables, views, functions and data. Maybe we can build 
something simpler to reproduce the problem.

I still checking whether it is okay to share the SQL. Until then, here are some 
general details.
It is basically a per order report on the availability of the inventory for a 
rental service.
Striped down, it builds an in memory calendar and calculates some sums for 
overlapping time periods, where some of the time periods has no end. (delayed 
return: late)

There are projects (table_e), the project has several orders (table_a). The 
order has a renting period, measured in days between start and end.
The period is not limited but somewhere between 1 - 365, usually between 5-15 
days.
An order can have multiple quotes (auf_oos), but only one of them is active at 
a time.
A quote lists multiple items (table_k). Usually 10-500 items per quote, where 
an item can have one or more accessories tied to it.
This list is the customer's order.

There is also a helper table that stores one row for each day of the order: 
(table_a_dtg) table_a.id and a date. In this table 5 day rental order has 5 
rows. (this is stored on disk and maintained via trigger, because using 
generate_series was too slow).

There is a list of possible products/items (table_s), which stores the 
company's own portion of the inventory. The other portion of the inventory can 
be temporarily held (rented long-term) and is stored in (al_ast).
Another portion of the inventory may come from other suppliers as needed. These 
stock items are rented for the order and are tied to it. The rent-order is 
located in al_zm, and the rent-order's item list is in al_zm_kal.

In addition, there are items that were not returned on time, were lost, or are 
temporarily blocked due to repairs. This renders the stock level of a future 
day-x not predictable.

The items required for a quote are manually allocated from one of the three 
possible sources. This allocation is stored in table_k.
The info that the rented items are fully or partly returned is also stored in 
table_k.

The primary function of this query is to list one row per quote, with multiple 
flags indicating the various possible summarized states of the quote. It also 
computes the total volume and weight of the order.
Some of the flags indicates various working phases or possible conflict states.
For example when inventory levels are insufficient, configured as "fulfilled 
from stock" but there is not enough items on stock, when items are configured 
as "fulfilled from rental" but no rental order has been placed, or the rental 
order has not the right amount of items, or when the required items are not 
returned as planned, or are returned damaged or are lost.
Because of resource limits, the flags are built only for quotes where the 
renting period includes a date between now and now+3 months.

To achieve this, the query builds a stock availability report for all items of 
the quotes on the fly for each item/day.

gauf_1 is table_a in a view is where an item stored in table_k will be combined 
with the rental period and so gets one row for each day for the rental period. 
This row is representing the required stock quantity per day for that and order.
These rows building the base of this query and will be combined to build the 
daily overall demand and state.
the view is simple:

select
...
from table_a_dtg gdt -- one row per order_rental_date, eg. 5 rows for a 5 days 
rental
left join table_a gauf on gauf.id=gdt.au_id -- one row per order
left join auf_oos goftr on goftr.au_id=gauf.id -- one row per quote
left join table_k gkal on gkal.oo_id=gofrt.id -- one row per quote item
where gdt.datum >= ('now'::text::date - '7 days'::interval)::date;

eg. a 3 day rental order with 2x1 items gets 6 rows
order1, item1, day1, 1 pcs
order1, item1, day2, 1 pcs
order1, item1, day3, 1 pcs
order1, item2, day1, 1 pcs
order1, item2, day2, 1 pcs
order1, item2, day3, 1 pcs

I can provide more details on other parts of the query too, if that helps.

regards,
Attila



Reply via email to