Re: issue with double ordering in a wrapped distinct - Mailing list pgsql-general

From Jonathan Vanasco
Subject Re: issue with double ordering in a wrapped distinct
Date
Msg-id D1576B60-B331-4555-AAFA-8CC8CF6E8CB7@2xlp.com
Whole thread Raw
In response to Re: issue with double ordering in a wrapped distinct  (Jonathan Vanasco <postgres@2xlp.com>)
List pgsql-general
I re-ran the query in multiple forms, and included it below  (I regexed it to become 'foo2bar' so it's more generic to
others).   

I also uploaded it as a public spreadsheet to google, because I think that is a bit easier to look at:

    https://docs.google.com/spreadsheets/d/1w9HM8w9YUpul5Bmy-uvzA4I6x5OFwWzR6K5atFG2ubw/edit?usp=sharing

The most interesting thing to me was how the planner was so drastically affected by interplay of distinct and order in
asubselect : 

    293 - SELECT ( SELECT DISTINCT ) ORDER LIMIT OFFSET
    293 - SELECT DISTINCT ( SELECT DISTINCT ORDER ) LIMIT OFFSET
    300 - SELECT DISTINCT ( SELECT ORDER ) LIMIT OFFSET
    6400 - SELECT( SELECT DISTINCT ORDER ) LIMIT OFFSET
    7631 - SELECT DISTINCT ( SELECT ) ORDER LIMIT OFFSET

And you can also see how the planner completely changed the strategy when LIMIT/OFFSET was introduced to the first
query--  

    394 SELECT ORDER BY;
    446501 SELECT ORDER BY LIMIT OFFSET;




====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================

Query A

    EXPLAIN ANALYZE
    SELECT DISTINCT foo_2_bar.bar_id
    FROM foo_2_bar
    JOIN foo ON foo_2_bar.foo_id = foo.id
    WHERE foo.attribute_id_a = 582
      AND (foo.is_a IS NOT TRUE)
      AND (foo.is_b IS NOT TRUE)
      AND (foo.is_c IS NOT TRUE)
      AND (foo.is_d IS NOT TRUE)
    ORDER BY foo_2_bar.bar_id ASC
    ;

                                                                              QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Unique  (cost=48810.15..48842.34 rows=6437 width=4) (actual time=283.850..389.587 rows=3468 loops=1)
   ->  Sort  (cost=48810.15..48826.25 rows=6437 width=4) (actual time=283.846..335.532 rows=44985 loops=1)
         Sort Key: foo_2_bar.bar_id
         Sort Method: quicksort  Memory: 3645kB
         ->  Nested Loop  (cost=322.52..48402.94 rows=6437 width=4) (actual time=2.734..221.878 rows=44985 loops=1)
               ->  Bitmap Heap Scan on foo  (cost=322.09..27984.32 rows=7679 width=4) (actual time=2.718..27.531
rows=7885loops=1) 
                     Recheck Cond: (attribute_id_a = 582)
                     Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT TRUE))
                     Rows Removed by Filter: 7
                     ->  Bitmap Index Scan on idx__foo__attribute_id_a  (cost=0.00..320.17 rows=7966 width=0) (actual
time=1.335..1.335rows=8161 loops=1) 
                           Index Cond: (attribute_id_a = 582)
               ->  Index Only Scan using idx__foo2bar__test on foo_2_bar  (cost=0.43..2.61 rows=5 width=8) (actual
time=0.004..0.010rows=6 loops=7885) 
                     Index Cond: (foo_id = foo.id)
                     Heap Fetches: 0
 Total runtime: 394.606 ms


====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================


Query A-LIMITED -- same as above, just adds a LIMIT/OFFSET

    EXPLAIN ANALYZE
    SELECT DISTINCT foo_2_bar.bar_id
    FROM foo_2_bar
    JOIN foo ON foo_2_bar.foo_id = foo.id
    WHERE foo.attribute_id_a = 582
      AND (foo.is_a IS NOT TRUE)
      AND (foo.is_b IS NOT TRUE)
      AND (foo.is_c IS NOT TRUE)
      AND (foo.is_d IS NOT TRUE)
    ORDER BY foo_2_bar.bar_id ASC
    LIMIT 50
    OFFSET 0
    ;

                                                                              QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.85..15386.21 rows=50 width=4) (actual time=57698.794..446500.933 rows=50 loops=1)
   ->  Unique  (cost=0.85..1980710.86 rows=6437 width=4) (actual time=57698.789..446500.787 rows=50 loops=1)
         ->  Nested Loop  (cost=0.85..1980694.77 rows=6437 width=4) (actual time=57698.784..446498.319 rows=2011
loops=1)
               ->  Index Scan using idx__foo2bar__bar_id on foo_2_bar  (cost=0.43..75725.91 rows=1517741 width=8)
(actualtime=0.017..10373.409 rows=364872 loops=1) 
               ->  Index Scan using idx__foo__filter1_a on foo  (cost=0.43..1.25 rows=1 width=4) (actual
time=1.192..1.192rows=0 loops=364872) 
                     Index Cond: (id = foo_2_bar.foo_id)
                     Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT TRUE)
AND(attribute_id_a = 582)) 
                     Rows Removed by Filter: 1
 Total runtime: 446501.050 ms
(9 rows)



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================


Query A-LIMITED-SUBSELECT-DOUBLEORDER -- That sucked.  Let's try wrapping Query A in a subselect

        EXPLAIN ANALYZE
        SELECT DISTINCT qinner.bar_id FROM
        (
            SELECT DISTINCT foo_2_bar.bar_id
            FROM foo_2_bar
            JOIN foo ON foo_2_bar.foo_id = foo.id
            WHERE foo.attribute_id_a = 582
              AND (foo.is_a IS NOT TRUE)
              AND (foo.is_b IS NOT TRUE)
              AND (foo.is_c IS NOT TRUE)
              AND (foo.is_d IS NOT TRUE)
            ORDER BY foo_2_bar.bar_id ASC
        ) qinner
        ORDER BY qinner.bar_id ASC
        LIMIT 50
        OFFSET 0
        ;
                                                                              QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=48810.15..48811.03 rows=50 width=4) (actual time=286.674..291.183 rows=50 loops=1)
   ->  Unique  (cost=48810.15..48922.80 rows=6437 width=4) (actual time=286.671..291.082 rows=50 loops=1)
         ->  Unique  (cost=48810.15..48842.34 rows=6437 width=4) (actual time=286.668..290.977 rows=50 loops=1)
               ->  Sort  (cost=48810.15..48826.25 rows=6437 width=4) (actual time=286.664..288.812 rows=2011 loops=1)
                     Sort Key: foo_2_bar.bar_id
                     Sort Method: quicksort  Memory: 3645kB
                     ->  Nested Loop  (cost=322.52..48402.94 rows=6437 width=4) (actual time=2.699..224.734 rows=44985
loops=1)
                           ->  Bitmap Heap Scan on foo  (cost=322.09..27984.32 rows=7679 width=4) (actual
time=2.682..28.245rows=7885 loops=1) 
                                 Recheck Cond: (attribute_id_a = 582)
                                 Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS
NOTTRUE)) 
                                 Rows Removed by Filter: 7
                                 ->  Bitmap Index Scan on idx__foo__attribute_id_a  (cost=0.00..320.17 rows=7966
width=0)(actual time=1.329..1.329 rows=8161 loops=1) 
                                       Index Cond: (attribute_id_a = 582)
                           ->  Index Only Scan using idx__foo2bar__test on foo_2_bar  (cost=0.43..2.61 rows=5 width=8)
(actualtime=0.004..0.011 rows=6 loops=7885) 
                                 Index Cond: (foo_id = foo.id)
                                 Heap Fetches: 0
 Total runtime: 293.399 ms
(17 rows)


Query A-LIMITED-SUBSELECT-DOUBLEORDER -- Does it matter where the distinct is?
    EXPLAIN ANALYZE
    SELECT DISTINCT qinner.bar_id FROM
    (
        SELECT foo_2_bar.bar_id
        FROM foo_2_bar
        JOIN foo ON foo_2_bar.foo_id = foo.id
        WHERE foo.attribute_id_a = 582
          AND (foo.is_a IS NOT TRUE)
          AND (foo.is_b IS NOT TRUE)
          AND (foo.is_c IS NOT TRUE)
          AND (foo.is_d IS NOT TRUE)
        ORDER BY foo_2_bar.bar_id ASC
    ) qinner
    ORDER BY qinner.bar_id ASC
    LIMIT 50
    OFFSET 0
    ;
    -- Total runtime: 291.729 ms

    EXPLAIN ANALYZE
    SELECT qinner.bar_id FROM
    (
        SELECT DISTINCT foo_2_bar.bar_id
        FROM foo_2_bar
        JOIN foo ON foo_2_bar.foo_id = foo.id
        WHERE foo.attribute_id_a = 582
          AND (foo.is_a IS NOT TRUE)
          AND (foo.is_b IS NOT TRUE)
          AND (foo.is_c IS NOT TRUE)
          AND (foo.is_d IS NOT TRUE)
        ORDER BY foo_2_bar.bar_id ASC
    ) qinner
    ORDER BY qinner.bar_id ASC
    LIMIT 50
    OFFSET 0
    ;
    -- Total runtime: 296.966 ms



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================

Query A-LIMITED-SUBSELECT-OUTERORDER

        EXPLAIN ANALYZE
        SELECT DISTINCT qinner.bar_id FROM
        (
            SELECT DISTINCT foo_2_bar.bar_id
            FROM foo_2_bar
            JOIN foo ON foo_2_bar.foo_id = foo.id
            WHERE foo.attribute_id_a = 582
              AND (foo.is_a IS NOT TRUE)
              AND (foo.is_b IS NOT TRUE)
              AND (foo.is_c IS NOT TRUE)
              AND (foo.is_d IS NOT TRUE)
        ) qinner
        ORDER BY qinner.bar_id ASC
        LIMIT 50
        OFFSET 0
        ;

                                                                              QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=48842.07..48842.20 rows=50 width=4) (actual time=303.474..303.634 rows=50 loops=1)
   ->  Sort  (cost=48842.07..48858.16 rows=6437 width=4) (actual time=303.471..303.520 rows=50 loops=1)
         Sort Key: foo_2_bar.bar_id
         Sort Method: top-N heapsort  Memory: 27kB
         ->  HashAggregate  (cost=48563.87..48628.24 rows=6437 width=4) (actual time=295.615..299.590 rows=3468
loops=1)
               ->  HashAggregate  (cost=48419.04..48483.41 rows=6437 width=4) (actual time=287.433..291.489 rows=3468
loops=1)
                     ->  Nested Loop  (cost=322.52..48402.94 rows=6437 width=4) (actual time=3.192..230.177 rows=44985
loops=1)
                           ->  Bitmap Heap Scan on foo  (cost=322.09..27984.32 rows=7679 width=4) (actual
time=3.174..29.242rows=7885 loops=1) 
                                 Recheck Cond: (attribute_id_a = 582)
                                 Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS
NOTTRUE)) 
                                 Rows Removed by Filter: 7
                                 ->  Bitmap Index Scan on idx__foo__attribute_id_a  (cost=0.00..320.17 rows=7966
width=0)(actual time=1.695..1.695 rows=8161 loops=1) 
                                       Index Cond: (attribute_id_a = 582)
                           ->  Index Only Scan using idx__foo2bar__test on foo_2_bar  (cost=0.43..2.61 rows=5 width=8)
(actualtime=0.004..0.011 rows=6 loops=7885) 
                                 Index Cond: (foo_id = foo.id)
                                 Heap Fetches: 0
 Total runtime: 303.766 ms
(17 rows)



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================

Query A-LIMITED-SUBSELECT-OUTERORDER - Variation -- distinct on outer only

    EXPLAIN ANALYZE
    SELECT DISTINCT qinner.bar_id FROM
    (
        SELECT foo_2_bar.bar_id
        FROM foo_2_bar
        JOIN foo ON foo_2_bar.foo_id = foo.id
        WHERE foo.attribute_id_a = 582
          AND (foo.is_a IS NOT TRUE)
          AND (foo.is_b IS NOT TRUE)
          AND (foo.is_c IS NOT TRUE)
          AND (foo.is_d IS NOT TRUE)
    ) qinner
    ORDER BY qinner.bar_id ASC
    LIMIT 50
    OFFSET 0
    ;

                                                                                                             QUERY PLAN

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.85..15386.24 rows=50 width=4) (actual time=201.565..7631.099 rows=50 loops=1)
   ->  Unique  (cost=0.85..1980714.86 rows=6437 width=4) (actual time=201.562..7630.960 rows=50 loops=1)
         ->  Nested Loop  (cost=0.85..1980698.77 rows=6437 width=4) (actual time=201.557..7628.555 rows=2011 loops=1)
               ->  Index Scan using idx__foo2bar__bar_id on foo_2_bar  (cost=0.43..75725.91 rows=1517741 width=8)
(actualtime=0.034..748.009 rows=364872 loops=1) 
               ->  Index Scan using idx__foo__filter1_a on foo  (cost=0.43..1.25 rows=1 width=4) (actual
time=0.016..0.016rows=0 loops=364872) 
                     Index Cond: (id = foo_2_bar.foo_id)
                     Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT TRUE)
AND(attribute_id_a = 582)) 
                     Rows Removed by Filter: 1
 Total runtime: 7631.194 ms
(9 rows)



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================

Query A-LIMITED-SUBSELECT-OUTERORDER - Variation -- distinct on inner only

    EXPLAIN ANALYZE
    SELECT qinner.bar_id FROM
    (
        SELECT DISTINCT foo_2_bar.bar_id
        FROM foo_2_bar
        JOIN foo ON foo_2_bar.foo_id = foo.id
        WHERE foo.attribute_id_a = 582
          AND (foo.is_a IS NOT TRUE)
          AND (foo.is_b IS NOT TRUE)
          AND (foo.is_c IS NOT TRUE)
          AND (foo.is_d IS NOT TRUE)
    ) qinner
    ORDER BY qinner.bar_id ASC
    LIMIT 50
    OFFSET 0
    ;

                                                                                    QUERY PLAN

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=48761.61..48761.73 rows=50 width=4) (actual time=293.188..293.334 rows=50 loops=1)
   ->  Sort  (cost=48761.61..48777.70 rows=6437 width=4) (actual time=293.185..293.234 rows=50 loops=1)
         Sort Key: foo_2_bar.bar_id
         Sort Method: top-N heapsort  Memory: 27kB
         ->  HashAggregate  (cost=48419.04..48483.41 rows=6437 width=4) (actual time=285.202..289.167 rows=3468
loops=1)
               ->  Nested Loop  (cost=322.52..48402.94 rows=6437 width=4) (actual time=3.022..228.559 rows=44985
loops=1)
                     ->  Bitmap Heap Scan on foo  (cost=322.09..27984.32 rows=7679 width=4) (actual time=2.999..29.461
rows=7885loops=1) 
                           Recheck Cond: (attribute_id_a = 582)
                           Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT
TRUE))
                           Rows Removed by Filter: 7
                           ->  Bitmap Index Scan on idx__foo__attribute_id_a  (cost=0.00..320.17 rows=7966 width=0)
(actualtime=1.325..1.325 rows=8161 loops=1) 
                                 Index Cond: (attribute_id_a = 582)
                     ->  Index Only Scan using idx__foo2bar__test on foo_2_bar  (cost=0.43..2.61 rows=5 width=8)
(actualtime=0.004..0.011 rows=6 loops=7885) 
                           Index Cond: (foo_id = foo.id)
                           Heap Fetches: 0
 Total runtime: 293.452 ms
(16 rows)



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================



Query A-LIMITED-SUBSELECT-INNERORDER

        EXPLAIN ANALYZE
        SELECT DISTINCT qinner.bar_id FROM
        (
            SELECT DISTINCT foo_2_bar.bar_id
            FROM foo_2_bar
            JOIN foo ON foo_2_bar.foo_id = foo.id
            WHERE foo.attribute_id_a = 582
              AND (foo.is_a IS NOT TRUE)
              AND (foo.is_b IS NOT TRUE)
              AND (foo.is_c IS NOT TRUE)
              AND (foo.is_d IS NOT TRUE)
            ORDER BY foo_2_bar.bar_id ASC
        ) qinner
        LIMIT 50
        OFFSET 0
        ;

                                                                              QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=48810.15..48811.03 rows=50 width=4) (actual time=287.143..291.677 rows=50 loops=1)
   ->  Unique  (cost=48810.15..48922.80 rows=6437 width=4) (actual time=287.140..291.575 rows=50 loops=1)
         ->  Unique  (cost=48810.15..48842.34 rows=6437 width=4) (actual time=287.137..291.469 rows=50 loops=1)
               ->  Sort  (cost=48810.15..48826.25 rows=6437 width=4) (actual time=287.133..289.328 rows=2011 loops=1)
                     Sort Key: foo_2_bar.bar_id
                     Sort Method: quicksort  Memory: 3645kB
                     ->  Nested Loop  (cost=322.52..48402.94 rows=6437 width=4) (actual time=2.713..225.116 rows=44985
loops=1)
                           ->  Bitmap Heap Scan on foo  (cost=322.09..27984.32 rows=7679 width=4) (actual
time=2.696..28.539rows=7885 loops=1) 
                                 Recheck Cond: (attribute_id_a = 582)
                                 Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS
NOTTRUE)) 
                                 Rows Removed by Filter: 7
                                 ->  Bitmap Index Scan on idx__foo__attribute_id_a  (cost=0.00..320.17 rows=7966
width=0)(actual time=1.325..1.325 rows=8161 loops=1) 
                                       Index Cond: (attribute_id_a = 582)
                           ->  Index Only Scan using idx__foo2bar__test on foo_2_bar  (cost=0.43..2.61 rows=5 width=8)
(actualtime=0.004..0.011 rows=6 loops=7885) 
                                 Index Cond: (foo_id = foo.id)
                                 Heap Fetches: 0
 Total runtime: 293.309 ms
(17 rows)



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================



Query A-LIMITED-SUBSELECT-INNERORDER - variation - outer distinct

        EXPLAIN ANALYZE
        SELECT DISTINCT qinner.bar_id FROM
        (
            SELECT foo_2_bar.bar_id
            FROM foo_2_bar
            JOIN foo ON foo_2_bar.foo_id = foo.id
            WHERE foo.attribute_id_a = 582
              AND (foo.is_a IS NOT TRUE)
              AND (foo.is_b IS NOT TRUE)
              AND (foo.is_c IS NOT TRUE)
              AND (foo.is_d IS NOT TRUE)
            ORDER BY foo_2_bar.bar_id ASC
        ) qinner
        LIMIT 50
        OFFSET 0
        ;

                                                                              QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=48810.15..48810.90 rows=50 width=4) (actual time=293.422..297.896 rows=50 loops=1)
   ->  Unique  (cost=48810.15..48906.71 rows=6437 width=4) (actual time=293.417..297.792 rows=50 loops=1)
         ->  Sort  (cost=48810.15..48826.25 rows=6437 width=4) (actual time=293.414..295.580 rows=2011 loops=1)
               Sort Key: foo_2_bar.bar_id
               Sort Method: quicksort  Memory: 3645kB
               ->  Nested Loop  (cost=322.52..48402.94 rows=6437 width=4) (actual time=2.706..231.424 rows=44985
loops=1)
                     ->  Bitmap Heap Scan on foo  (cost=322.09..27984.32 rows=7679 width=4) (actual time=2.690..30.373
rows=7885loops=1) 
                           Recheck Cond: (attribute_id_a = 582)
                           Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT
TRUE))
                           Rows Removed by Filter: 7
                           ->  Bitmap Index Scan on idx__foo__attribute_id_a  (cost=0.00..320.17 rows=7966 width=0)
(actualtime=1.316..1.316 rows=8161 loops=1) 
                                 Index Cond: (attribute_id_a = 582)
                     ->  Index Only Scan using idx__foo2bar__test on foo_2_bar  (cost=0.43..2.61 rows=5 width=8)
(actualtime=0.004..0.011 rows=6 loops=7885) 
                           Index Cond: (foo_id = foo.id)
                           Heap Fetches: 0
 Total runtime: 299.542 ms
(16 rows)



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================



Query A-LIMITED-SUBSELECT-INNERORDER - variation - inner distinct

        EXPLAIN ANALYZE
        SELECT qinner.bar_id FROM
        (
            SELECT DISTINCT foo_2_bar.bar_id
            FROM foo_2_bar
            JOIN foo ON foo_2_bar.foo_id = foo.id
            WHERE foo.attribute_id_a = 582
              AND (foo.is_a IS NOT TRUE)
              AND (foo.is_b IS NOT TRUE)
              AND (foo.is_c IS NOT TRUE)
              AND (foo.is_d IS NOT TRUE)
            ORDER BY foo_2_bar.bar_id ASC
        ) qinner
        LIMIT 50
        OFFSET 0
        ;

                                                                              QUERY PLAN

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.85..15386.74 rows=50 width=4) (actual time=181.256..6408.615 rows=50 loops=1)
   ->  Unique  (cost=0.85..1980714.86 rows=6437 width=4) (actual time=181.252..6408.492 rows=50 loops=1)
         ->  Nested Loop  (cost=0.85..1980698.77 rows=6437 width=4) (actual time=181.248..6406.149 rows=2011 loops=1)
               ->  Index Scan using idx__foo2bar__bar_id on foo_2_bar  (cost=0.43..75725.91 rows=1517741 width=8)
(actualtime=0.031..768.898 rows=364872 loops=1) 
               ->  Index Scan using idx__foo__filter1_a on foo  (cost=0.43..1.25 rows=1 width=4) (actual
time=0.013..0.013rows=0 loops=364872) 
                     Index Cond: (id = foo_2_bar.foo_id)
                     Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT TRUE)
AND(attribute_id_a = 582)) 
                     Rows Removed by Filter: 1
 Total runtime: 6408.725 ms
(9 rows)



====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================


Query B

    EXPLAIN ANALYZE
    SELECT foo_2_bar.bar_id
    FROM foo_2_bar
    JOIN foo ON foo_2_bar.foo_id = foo.id
    WHERE foo.attribute_id_a = 582
      AND (foo.is_a IS NOT TRUE)
      AND (foo.is_b IS NOT TRUE)
      AND (foo.is_c IS NOT TRUE)
      AND (foo.is_d IS NOT TRUE)
    GROUP BY foo_2_bar.bar_id
    ORDER BY foo_2_bar.bar_id ASC
    ;

                                                                                 QUERY PLAN

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Group  (cost=48810.15..48842.34 rows=6437 width=4) (actual time=291.317..391.371 rows=3468 loops=1)
   ->  Sort  (cost=48810.15..48826.25 rows=6437 width=4) (actual time=291.310..340.108 rows=44985 loops=1)
         Sort Key: foo_2_bar.bar_id
         Sort Method: quicksort  Memory: 3645kB
         ->  Nested Loop  (cost=322.52..48402.94 rows=6437 width=4) (actual time=3.183..229.189 rows=44985 loops=1)
               ->  Bitmap Heap Scan on foo  (cost=322.09..27984.32 rows=7679 width=4) (actual time=3.165..29.759
rows=7885loops=1) 
                     Recheck Cond: (attribute_id_a = 582)
                     Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT TRUE))
                     Rows Removed by Filter: 7
                     ->  Bitmap Index Scan on idx__foo__attribute_id_a  (cost=0.00..320.17 rows=7966 width=0) (actual
time=1.792..1.792rows=8161 loops=1) 
                           Index Cond: (attribute_id_a = 582)
               ->  Index Only Scan using idx__foo2bar__test on foo_2_bar  (cost=0.43..2.61 rows=5 width=8) (actual
time=0.004..0.011rows=6 loops=7885) 
                     Index Cond: (foo_id = foo.id)
                     Heap Fetches: 0
 Total runtime: 396.417 ms
(15 rows)


====================================================================================================================================================================

====================================================================================================================================================================

====================================================================================================================================================================


Query B-LIMITED

    EXPLAIN ANALYZE
    SELECT foo_2_bar.bar_id
    FROM foo_2_bar
    JOIN foo ON foo_2_bar.foo_id = foo.id
    WHERE foo.attribute_id_a = 582
      AND (foo.is_a IS NOT TRUE)
      AND (foo.is_b IS NOT TRUE)
      AND (foo.is_c IS NOT TRUE)
      AND (foo.is_d IS NOT TRUE)
    GROUP BY foo_2_bar.bar_id
    ORDER BY foo_2_bar.bar_id ASC
    LIMIT 50
    OFFSET 0
    ;

                                                                                 QUERY PLAN

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.85..15386.21 rows=50 width=4) (actual time=6317.604..223730.162 rows=50 loops=1)
   ->  Group  (cost=0.85..1980710.86 rows=6437 width=4) (actual time=6317.599..223730.023 rows=50 loops=1)
         ->  Nested Loop  (cost=0.85..1980694.77 rows=6437 width=4) (actual time=6317.595..223727.621 rows=2011
loops=1)
               ->  Index Scan using idx__foo2bar__bar_id on foo_2_bar  (cost=0.43..75725.91 rows=1517741 width=8)
(actualtime=0.018..3623.783 rows=364872 loops=1) 
               ->  Index Scan using idx__foo__filter1_a on foo  (cost=0.43..1.25 rows=1 width=4) (actual
time=0.601..0.601rows=0 loops=364872) 
                     Index Cond: (id = foo_2_bar.foo_id)
                     Filter: ((is_a IS NOT TRUE) AND (is_b IS NOT TRUE) AND (is_c IS NOT TRUE) AND (is_d IS NOT TRUE)
AND(attribute_id_a = 582)) 
                     Rows Removed by Filter: 1
 Total runtime: 223730.277 ms
(9 rows)




pgsql-general by date:

Previous
From: Adrian Klaver
Date:
Subject: Re: postgresql for small business
Next
From: Jeff Janes
Date:
Subject: Re: [general] Error while decrypting using pgp