Hi Noel and Thomas.

Here is a simplified use case:

CREATE TABLE REF (POSITION VARCHAR(10), REF_1 VARCHAR(1), REF_2 VARCHAR(8), 
REF_3 VARCHAR(8),REF_4 VARCHAR(1),REF_5 VARCHAR(1),REF_6 VARCHAR(3))

CREATE INDEX IDX_REF ON REF (REF_3,REF_6)

This request is fast :
SELECT r.ref_1, r.ref_3,
    (SELECT COUNT(*)
    FROM ref rc
    WHERE rc.ref_3  = r.ref_3
    AND rc.position <= r.position
    ) NO_OCCURRENCE
  FROM ref r

The plan is :

SELECT
    R.REF_1,
    R.REF_3,
    (SELECT
        COUNT(*)
    FROM PUBLIC.REF RC
        /* PUBLIC.IDXR: REF_3 = R.REF_3 */
    WHERE (RC.REF_3 = R.REF_3)
        AND (RC.POSITION <= R.POSITION)) AS NO_OCCURRENCE
FROM PUBLIC.REF R
    /* PUBLIC.REF.tableScan */



This request take a huge time : 
SELECT * FROM (
      SELECT r.ref_1, r.ref_3,
    (SELECT COUNT(*)
    FROM ref rc
    WHERE rc.ref_3  = r.ref_3
    AND rc.position <= r.position
    ) NO_OCCURRENCE
  FROM ref r
)

The plan of this long request:
SELECT
    _7.REF_1,
    _7.REF_3,
    _7.NO_OCCURRENCE
FROM (
    SELECT
        R.REF_1,
        R.REF_3,
        (SELECT
            COUNT(*)
        FROM PUBLIC.REF RC
            /* PUBLIC.IDXR: REF_3 = R.REF_3 */
        WHERE (RC.REF_3 = R.REF_3)
            AND (RC.POSITION <= R.POSITION)) AS NO_OCCURRENCE
    FROM PUBLIC.REF R
        /* PUBLIC.REF.tableScan */
) _7
    /* SELECT
        R.REF_1,
        R.REF_3,
        (SELECT
            COUNT(*)
        FROM PUBLIC.REF RC
            /++ PUBLIC.IDXR: REF_3 = R.REF_3 ++/
        WHERE (RC.REF_3 = R.REF_3)
            AND (RC.POSITION <= R.POSITION)) AS NO_OCCURRENCE
    FROM PUBLIC.REF R
        /++ PUBLIC.REF.tableScan ++/
     */ 

I don't understand why enclosing the first request in a SELECT * FROM () 
degrades the performance.

Regards

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/h2-database.
For more options, visit https://groups.google.com/d/optout.

Reply via email to