On Fri, Mar 28, 2025 at 9:35 AM Laurenz Albe <laurenz.a...@cybertec.at>
wrote:

> On Fri, 2025-03-28 at 13:38 +0100, Moreno Andreo wrote:
> >  Postgres 16.4 (planning to go on 17.4)
> >  I'm creating some indexes based on some slow query reported by logs.
> >  These queries involve a WHERE with more than 5 fields, that are
> matching by =, <>, LIKE and IN()
> >  I read that equality fields must be first, then the others.
> >  Is it correct?
>
> Fundamentally yes, but you also have to consider how selective the
> conditions are.
> Putting a column in the index where the condition will only filter out few
> rows
> is not going to help; such rows should be omitted from the index.
>
> > Based on this query
> >                  SELECT COUNT(id) AS total
> >                  FROM nx.tbl1
> >                  WHERE
> >              (date_order >= '2025-03-21')
> >              AND (date_order <= '2025-03-29')
> >              AND (flag = TRUE)
> >              AND ((
> >                -- (flag = TRUE)
> >                -- AND (((tipo <> 'C') AND (tipo <> 'V') AND (tipo <>
> 'F')) OR (tipo IS NULL) OR (tipo = ''))
> >                (((op <> 'C') OR (op IS NULL)) OR (tipo = 'F'))
> >                AND (s_state IN
> ('ENQ','WFR','BLQ','BLR','WFA','FRW','FRO','0000','0001'))
> >                AND (tiporic IS NOT NULL)
> >                AND (tiporic NOT LIKE '%cart%')
> >              ) OR (
> >                (tiporic LIKE '%cart%') AND (S_state <> 'CON') AND
> (s_state <> '0002') AND ((op <> 'C') OR (op IS NULL))
> >              ))  AND (priv IS NULL OR priv = false OR (priv = true and
> idpriv = 'TEST')));
> >
> >  Should the following index be correct?
> >
> >  CREATE INDEX IF NOT EXISTS tbl1_count_idx on nx.tbl1 USING BTREE(flag,
> tipo, op, priv, idpriv, date_order, s_state, tiporic);
> >
> >  Would it be better to create a separate GIN/GIST index for the field
> matched with LIKE?
>
> The ORs will be a problem. Get rid of them as much as possible by using
> UNION,
> at least for WHERE conditions that are selective.
>

"at least for WHERE conditions that are selective" confuses me.  Aren't
_all_ WHERE clauses selective?

-- 
Death to <Redacted>, and butter sauce.
Don't boil me, I'm still alive.
<Redacted> lobster!

Reply via email to