db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrew Alsup <bluesbrea...@gmail.com>
Subject Derby 10.5.3: subquery performance using "IN"
Date Tue, 10 Nov 2009 03:50:20 GMT
I am experiencing a dramatic performance hit with a subquery utilizing
a "IN" predicate.  The query involves a total of 4 tables.  If I run
the query (with subquery) it takes ~4.5sec to complete.  If I execute
the subquery by itself, it takes ~0.03sec to complete.  If I then copy
the results of the subquery directly into the "IN" clause of the
parent query, it takes only ~0.02sec to run.  So, I would expect the
combined query (with subquery) to take ~0.5sec (give or take a few
millis).  I'm experiencing an 800% slowdown by performing the
subquery.

Is there anything I can do to restructure my query?

Thanks for any help you can provide.  More information provided below.

FWIW, the performance problem was originally identified with an UPDATE
statement (with subquery), but I've rewritten it as a SELECT here.

-- Andy



The 4 tables are:
end_item_meter: 461,617 rows
meter_reading: 2,776,955 rows
end_item_event: 1,704,171 rows
end_Item_inventory: 233,057 rows

--------------------------------------------
--  This is the real query (with subquery)
--------------------------------------------

SELECT em.end_item_meter_id
FROM   end_item_meter em
WHERE  em.end_Item_meter_id IN
    (
    SELECT
        mr.end_item_meter_id
    FROM
        Meter_Reading mr
            INNER JOIN End_Item_Event eie
                ON eie.end_Item_Event_Id = mr.end_Item_event_Id
            INNER JOIN End_Item_Inventory eii
                ON eii.end_Item_inventory_Id = eie.end_Item_inventory_id
    WHERE
        eii.End_Item_Inventory_Id = 6061799
    );


=================================================================================================
Query 1 of 1 elapsed time (seconds) - Total: 4.458, SQL query: 0.025,
Building output: 4.433
=================================================================================================

END_ITEM_METER_ID
-----------------
6162998
6162999
6163002
6163003

--------------------------------------------
--  Run subquery by itself
--------------------------------------------
SELECT
    mr.end_item_meter_id
FROM
    Meter_Reading mr
        INNER JOIN End_Item_Event eie
            ON eie.end_Item_Event_Id = mr.end_Item_event_Id
        INNER JOIN End_Item_Inventory eii
            ON eii.end_Item_inventory_Id = eie.end_Item_inventory_id
WHERE
    eii.End_Item_Inventory_Id = 6061799;


=================================================================================================
Query 1 of 1 elapsed time (seconds) - Total: 0.031, SQL query: 0.022,
Building output: 0.00
=================================================================================================

END_ITEM_METER_ID
-----------------
6163002
6163003
6162999
6162998
6162999
6162998
6162999
6162998
6162999
6162998


--------------------------------------------
-- Run outer query with explicit values returned by inner query
--------------------------------------------
SELECT em.end_item_meter_id
FROM   end_item_meter em
WHERE  em.end_Item_meter_id IN
    (
        6163002,
        6163003,
        6162999,
        6162998,
        6162999,
        6162998,
        6162999,
        6162998,
        6162999,
        6162998
    );

=================================================================================================
Query 1 of 1 elapsed time (seconds) - Total: 0.021, SQL query: 0.013,
Building output: 0.008
=================================================================================================

END_ITEM_METER_ID
-----------------
6162998
6162999
6163002
6163003

Mime
View raw message