setze mal einen index auf die spalte datum und teste, ob das genug bringt
falls nicht, kann es vielleicht was helfen, wenn du z.B. das jahr in eine eigene spalte auslagerst, und vielleicht genauso den monat, dann kannst du die datenmenge, auf die das between ausgefuehrt wird, mit: where jahr=2004 and (monat=12 or monat=11) oder aehnlich verkleinern, was das ganze beschleunigen muesste; dafuer handelst du dir bei insert/updates mehr arbeit ein. vielleicht kann man die befuellung dieser beiden spalten durch einen trigger vornehmen, aber das kostet auch laufzeit; du musst halt abschaetzen, was dir wichtiger ist.
wenn gewisse bereiche haeufiger benoetigt werden (z.B. vom 1. d. Monats bis zum letzten tag), kann es auch helfen, fuer diese bereiche verschiedene views anzulegen und dann die abfrage gegen den view richten. ich kann dir aber nicht sagen, ob du dadurch was gewinnst und wieviel, weil ich mich mit postgre nicht besonders gut auskenne und deine Daten nicht kenne