Hoi,
Ik heb een query die een join doet op 2 tabellen.
Deze hebben de volgende vorm (vereenvoudigd)
Voor T1 heb ik (als test) 3 indexes: op id, op status en op (id,status)
Als ik nu de volgende query schrijf:
Wordt de index gebruikt.
Schrijf ik echter
Dan wordt de index niet gebruikt. Explain geeft dan:
Herschrijf ik mijn query nu naar het equivalente:
Dan wordt de index weer WEL gebruikt. Explain geeft dan:
Zet ik er nog een conditie bij, bv:
Dan word de index weer NIET gebruikt.
Weet iemand waarom dit zo is? Als een index al niet meer gebruikt kan worden bij een paar condities in een where clause dan hebben die dingen bijna nergens zin. Ik heb zowat geen enkele query waarbij mijn where clause slechts 1 of 2 condities bevat.
Mijn DB is trouwens postgresql 7.4. (Deze constructie komt voor als onderdeel in een query die 700ms duurt. Aangezien iedereen altijd hier zegt dat elke query in 100ms moet kunnen, probeer ik deze sneller te maken.)
Ik heb een query die een join doet op 2 tabellen.
Deze hebben de volgende vorm (vereenvoudigd)
code:
1
2
3
4
5
| T1 id status T2 t1_id |
Voor T1 heb ik (als test) 3 indexes: op id, op status en op (id,status)
Als ik nu de volgende query schrijf:
SQL:
1
2
3
4
| SELECT * FROM T1,T2 WHERE id = t1_id |
Wordt de index gebruikt.
Schrijf ik echter
SQL:
1
2
3
4
5
| SELECT * FROM T1,T2 WHERE id = t1_id AND status IN (2,3,4) |
Dan wordt de index niet gebruikt. Explain geeft dan:
code:
1
2
| -> Seq Scan on T1 ( cost = 179.89..593.75 rows=195 width = 84)
Filter: ( (status=2) OR (status=3) OR (status=5) |
Herschrijf ik mijn query nu naar het equivalente:
SQL:
1
2
3
4
5
| SELECT * FROM T1,T2 WHERE id = t1_id AND ((status = 2) OR (status =3) OR (status=4)) |
Dan wordt de index weer WEL gebruikt. Explain geeft dan:
code:
1
2
| -> Index Scan using T1_status_index,T1_status_index,T1_status_index ON T1 (cost=0.00..22.40 rows=390 width=84)
Index Cond: ((status = 2) OR (status =3) OR (status=4)) |
Zet ik er nog een conditie bij, bv:
SQL:
1
2
3
4
5
6
7
8
9
10
| SELECT * FROM T1,T2 WHERE id = t1_id AND ((status = 2) OR (status =3) OR (status=4)) AND id IN ( SELECT id FROM T3 WHERE bar = 'foo' ) |
Dan word de index weer NIET gebruikt.
Weet iemand waarom dit zo is? Als een index al niet meer gebruikt kan worden bij een paar condities in een where clause dan hebben die dingen bijna nergens zin. Ik heb zowat geen enkele query waarbij mijn where clause slechts 1 of 2 condities bevat.
Mijn DB is trouwens postgresql 7.4. (Deze constructie komt voor als onderdeel in een query die 700ms duurt. Aangezien iedereen altijd hier zegt dat elke query in 100ms moet kunnen, probeer ik deze sneller te maken.)