Re: pb with join plan

Поиск
Список
Период
Сортировка
От Marc Millas
Тема Re: pb with join plan
Дата
Msg-id CADX_1abOJdQzjP==BnhJEnZ6FW6LM7T-TnCqxpKtMvAExobSTA@mail.gmail.com
обсуждение исходный текст
Ответ на Re: pb with join plan  (Kirk Wolak <wolakk@gmail.com>)
Список pgsql-general




On Tue, Jun 27, 2023 at 8:12 PM Kirk Wolak <wolakk@gmail.com> wrote:
On Wed, Jun 21, 2023 at 12:10 PM Marc Millas <marc.millas@mokadb.com> wrote:
Marc MILLAS
On Wed, Jun 21, 2023 at 12:43 PM Tomas Vondra <tomas.vondra@enterprisedb.com> wrote:
On 6/21/23 00:26, Marc Millas wrote:
>
>
> On Tue, Jun 20, 2023 at 11:19 PM David Rowley <dgrowleyml@gmail.com
> <mailto:dgrowleyml@gmail.com>> wrote:
>
>     On Wed, 21 Jun 2023 at 08:34, Marc Millas <marc.millas@mokadb.com
>     <mailto:marc.millas@mokadb.com>> wrote:
>     >
>     > On Tue, Jun 20, 2023 at 10:14 PM David Rowley
>     <dgrowleyml@gmail.com <mailto:dgrowleyml@gmail.com>> wrote:
>     >>
>     >> On Wed, 21 Jun 2023 at 07:42, Marc Millas <marc.millas@mokadb.com
>     <mailto:marc.millas@mokadb.com>> wrote:
>     >> > But if I do the same with clause one OR clause 2, I have to 
>     kill the request after an hour, seeing the filesystem showing more
>     than 140 Mb of increased usage.

It's a bit weird the "victor" table is joined seemingly without any join
conditions, leading to a cross join (which massively inflates the cost
for joins above it). Maybe the anonymized plan mangles it somehow.

So I did try to simplify my pb.
I create a table with the result of the first 3 joins.
That table do have 15M lines. all tables have been vacuum analyze

Now if I do an explain analyze of a simple join between that table and my original table 4
using a simple = clause, I get a result in one second (around). and the planner guesses for rows seems in line with the observed values .
if I use a substr(table1.a)= table2.b, the explain analyze get a result in 21 seconds and the planner estimates a 65M rows result set while the observed is 330 k rows
so here its 20 times slower and the discrepency between planner rows guess and reality is a 200 ratio.

Now, if I try an explain analyze with join on a=b or substr(c)=d or e=f
then... I kill the query after a quarter an hour without any answer.
if I try to just explain the query, the planner rows guess becomes more than 2 Billions....
the extremely simple query and plan are here, without automatic obfuscation

First, I am not sure why you cannot send us the explain analyze.  But moving on...
Kirk, the explain analyze, with the SQL query is directly accessible  on the explain.depesz link .

substr() is a function that mutilates a value such that the index becomes useless...
If you are looking for the LEFT() of the value, then an INDEX can be used.
I have COLLATION "C" and when I query:
WHERE fld like  fld_b||"%"

there are NO indexes on those columns. One of the reasons is that the simplest index on one column is 380 GB on disk
So to put indexes on each criteria, I must add around 1 TB of disk  just for ttt.... 
the full scan is not a problem. Its fast.. The problem is the nested loop which do compare each of the 15M lines of ttt to each of the 30K lines of inc_pha_r.
its an operation done 450 000 000 000 times. so if each comparison is 1 microsecond long, the nested loop is 125 hours long.
And I am not sure that the comparison is done in 1 microsecond...

The optimizer constructs a query that uses the index on "fld"...
But when I try:

WHERE fld like CONCAT_WS("", fld_b,"%")
It doesn't use the index version. (because the function call is too complicated to see through)

When using functions in where clauses, indexes either have to be made on those functions, or often times the index cannot be used.

BTW, I noted the COLLATION.  That turned out to be important, because my first DB test did NOT use that collation, and the result
of the LIKE was the non-indexed version...  

I hope you find something useful in here.
Thanks for trying  

Also, WHERE fld <> 72...  (unless you have a heavily skewed set of statistics, I read that as.  SCAN everything, and check later,
because this should filter very few rows), whereas fld = 72 will be blazingly fast.

Kirk

В списке pgsql-general по дате отправления:

Предыдущее
От: Sergey Fukanchik
Дата:
Сообщение: Re: regex failing
Следующее
От: Jeremy Schneider
Дата:
Сообщение: Re: typical active table count?