Greetings,

I have stumbled upon a confusing aspect of PostgreSQL queries involving ORDER 
BY.

In trying to figure out just why my ORDER BY queries were so slow, I came 
across something interesting.

First, let me give you 2 very similar queries:

1) SELECT p.uid 
    FROM client_profiles p 
    INNER JOIN client_profiles_2 c 
    USING(uid) 
    WHERE (p.profiles_gender='M') 
    AND (p.profiles_orientation[2] = 'F' OR p.profiles_orientation[1]='M')    
    ORDER BY c.profiles_2_last_update DESC
    LIMIT 5;

2) SELECT p.uid 
    FROM client_profiles p 
    INNER JOIN client_profiles_2 c 
    USING(uid) 
    WHERE (p.profiles_gender='F') 
    AND (p.profiles_orientation[2] = 'F' OR p.profiles_orientation[1]='M')    
    ORDER BY c.profiles_2_last_update DESC
    LIMIT 5;

The only difference is in #1, p.profiles_gender='M' while in #2 
p.profiles_gender='F'.

SELECT count(uid) 
FROM client_profiles 
WHERE profiles_gender='M';
----------------------
408526

SELECT count(uid) 
FROM client_profiles 
WHERE profiles_gender='F';
----------------------
54713

Here are the EXPLAINs:

1) EXPLAIN #1:
Limit  (cost=0.00..1763.83 rows=5 width=24)
  ->  Nested Loop  (cost=0.00..2203068.58 rows=6245 width=24)
        ->  Index Scan Backward using index_client_profiles_2_last_up on 
client_profiles_2 c  (cost=0.00..239553.52 rows=394263 width=16)
        ->  Index Scan using client_profiles_pkey on client_profiles p  
(cost=0.00..4.97 rows=1 width=8)

2) EXPLAIN #2:
Limit  (cost=36046.44..36046.44 rows=5 width=24)
  ->  Sort  (cost=36046.44..36046.44 rows=160 width=24)
        ->  Nested Loop  (cost=0.00..36040.58 rows=160 width=24)
              ->  Index Scan using index_client_profiles_gender on 
client_profiles p  (cost=0.00..35064.98 rows=198 width=8)
              ->  Index Scan using client_profiles_2_pkey on 
client_profiles_2 c  (cost=0.00..4.91 rows=1 width=16)
    
Now the only reason I can see to explain this is because there are many more 
p.profiles_gender='M' than p.profiles_gender='F', Postgres knows its faster 
to do a Index Scan Backward than a Sort/Sequential Scan (and trust me, it 
is!). However it thinks the opposite when I am searching for 
p.profiles_gender='F' and form my results, that just isn't true.

Does anyone have any insight as to how I can 'force' postgres to use Index 
Backward Scan for #2???

Or, perhaps another method of making my ORDER BY faster ??

Your help would be greatly appreciated, Thanks

-- 
Keith Bussey
[EMAIL PROTECTED]
Programmer - WISOL.com
(514) 398-9994 ext. 225

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://www.postgresql.org/search.mpl

Reply via email to