Was ich nicht verstehe ist, wie Firebird unterscheidet welcher Index genommen werden soll.
1. Ein Index, der nicht existiert, wird auch nicht genommen
2. max() wird beschleunigt durch einen descending index
3. min() wird beschleunigt durch einen ascending index
4. sollten zusätzliche Bedingungen existieren, wie zB < oder = oder >, dann können beide Indextypen helfen
5. order by sorgt ggf. auch für indexbenutzung, sofern passende reihenfolge, muss aber nicht unbedingt vorteilhaft sein
6. Welcher Index von mehreren gleichwertigen zuerst genommen wird, entscheidet firebird mit Hilfe der Index Statistik, der sozusagen der Kehrwert der Eindeutigkeit darstellt (=Selektivität)
7. pro
SQL kann Firebird pro Tabelle mehr als einen Index benutzen, weil Zwischenergebnisse der rdb$db_keys aus den Indizes übereinander gelegt werden
Die Infos aus 6. und 7. erfordern aber schon ein wenig Basiskenntnisse über Firebird und der Architektur dahinter, unötige Indizes oder unbrauchbare mit mieser Selektivität oder kombinierte Indizes mit unbrauchbarer Feldreihenfolge machen ggf.
SQL Abfragen langsamer als man denkt. Wir haben schon so manche Abfrage durch löschen oder austricksen von Indizes beschleunigt, gibt aber nicht unbedingt irgendwelche immergültigen Bauernregeln ...