8000 revert: Transform OR clauses to ANY expression · postgrespro/postgres@ff9f72c · GitHub
[go: up one dir, main page]

Skip to content
  • Commit ff9f72c

    Browse files
    committed
    revert: Transform OR clauses to ANY expression
    This commit reverts 72bd38c due to implementation and design issues. Reported-by: Tom Lane Discussion: https://postgr.es/m/3604469.1712628736%40sss.pgh.pa.us
    1 parent 5a15bde commit ff9f72c

    File tree

    14 files changed

    +20
    -786
    lines changed

    14 files changed

    +20
    -786
    lines changed

    doc/src/sgml/config.sgml

    Lines changed: 0 additions & 57 deletions
    Original file line numberDiff line numberDiff line change
    @@ -6304,63 +6304,6 @@ SELECT * FROM parent WHERE key = 2400;
    63046304
    </listitem>
    63056305
    </varlistentry>
    63066306

    6307-
    <varlistentry id="guc-or-to-any-transform-limit" xreflabel="or_to_any_transform_limit">
    6308-
    <term><varname>or_to_any_transform_limit</varname> (<type>boolean</type>)
    6309-
    <indexterm>
    6310-
    <primary><varname>or_to_any_transform_limit</varname> configuration parameter</primary>
    6311-
    </indexterm>
    6312-
    </term>
    6313-
    <listitem>
    6314-
    <para>
    6315-
    Sets the minimum length of arguments in an <literal>OR</literal>
    6316-
    expression exceeding which planner will try to lookup and group
    6317-
    multiple similar <literal>OR</literal> expressions to
    6318-
    <literal>ANY</literal> (<xref linkend="functions-comparisons-any-some"/>)
    6319-
    expressions. The grouping technique of this transformation is based
    6320-
    on the equivalence of variable sides. One side of such an expression
    6321-
    must be a constant clause, and the other must contain a variable
    6322-
    clause. The default value is <literal>5</literal>. The value of
    6323-
    <literal>-1</literal> completely disables the transformation.
    6324-
    </para>
    6325-
    <para>
    6326-
    The advantage of this <literal>OR-to-ANY</literal> transformation is
    6327-
    faster query planning and execution. In certain cases, this
    6328-
    transformation also leads to more effective plans containing
    6329-
    a single index scan instead of multiple bitmap scans. However, it
    6330-
    may also cause a planning regression when distinct
    6331-
    <literal>OR</literal> arguments are better to match to distinct indexes.
    6332-
    This may happen when they have different matching partial indexes or
    6333-
    have different distributions of other columns used in the query.
    6334-
    Generally, more groupable <literal>OR</literal> arguments mean that
    6335-
    transformation will be more likely to win than to lose.
    6336-
    </para>
    6337-
    <para>
    6338-
    For example, this query has its set of five <literal>OR</literal>
    6339-
    expressions transformed to <literal>ANY</literal> with the default
    6340-
    value of <varname>or_to_any_transform_limit</varname>. But not with
    6341-
    the increased value.
    6342-
    <programlisting>
    6343-
    # EXPLAIN SELECT * FROM tbl WHERE key = 1 OR key = 2 OR key = 3 OR key = 4 OR key = 5;
    6344-
    QUERY PLAN
    6345-
    -----------------------------------------------------
    6346-
    Seq Scan on tbl (cost=0.00..51.44 rows=64 width=4)
    6347-
    Filter: (key = ANY ('{1,2,3,4,5}'::integer[]))
    6348-
    (2 rows)
    6349-
    6350-
    # SET or_to_any_transform_limit = 6;
    6351-
    SET
    6352-
    6353-
    # EXPLAIN SELECT * FROM tbl WHERE key = 1 OR key = 2 OR key = 3 OR key = 4 OR key = 5;
    6354-
    QUERY PLAN
    6355-
    ---------------------------------------------------------------------------
    6356-
    Seq Scan on tbl (cost=0.00..67.38 rows=63 width=4)
    6357-
    Filter: ((key = 1) OR (key = 2) OR (key = 3) OR (key = 4) OR (key = 5))
    6358-
    (2 rows)
    6359-
    </programlisting>
    6360-
    </para>
    6361-
    </listitem>
    6362-
    </varlistentry>
    6363-
    63646307
    <varlistentry id="guc-plan-cache-mode" xreflabel="plan_cache_mode">
    63656308
    <term><varname>plan_cache_mode</varname> (<type>enum</type>)
    63666309
    <indexterm>

    src/backend/nodes/queryjumblefuncs.c

    Lines changed: 0 additions & 27 deletions
    Original file line numberDiff line numberDiff line change
    @@ -141,33 +141,6 @@ JumbleQuery(Query *query)
    141141
    return jstate;
    142142
    }
    143143

    144-
    JumbleState *
    145-
    JumbleExpr(Expr *expr, uint64 *exprId)
    146-
    {
    147-
    JumbleState *jstate = NULL;
    148-
    149-
    Assert(exprId != NULL);
    150-
    151-
    jstate = (JumbleState *) palloc(sizeof(JumbleState));
    152-
    153-
    /* Set up workspace for query jumbling */
    154-
    jstate->jumble = (unsigned char *) palloc(JUMBLE_SIZE);
    155-
    jstate->jumble_len = 0;
    156-
    jstate->clocations_buf_size = 32;
    157-
    jstate->clocations = (LocationLen *)
    158-
    palloc(jstate->clocations_buf_size * sizeof(LocationLen));
    159-
    jstate->clocations_count = 0;
    160-
    jstate->highest_extern_param_id = 0;
    161-
    162-
    /* Compute query ID */
    163-
    _jumbleNode(jstate, (Node *) expr);
    164-
    *exprId = DatumGetUInt64(hash_any_extended(jstate->jumble,
    165-
    jstate->jumble_len,
    166-
    0));
    167-
    168-
    return jstate;
    169-
    }
    170-
    171144
    /*
    172145
    * Enables query identifier computation.
    173146
    *

    0 commit comments

    Comments
     (0)
    0