Datumsabfrage Jahrestage

Datumsabfrage Jahrestage

am 04.12.2007 15:24:12 von Thomas Poppner

Hallo,

kann mir jemand sagen, wie sinnvoll es ist, häufig Jahrestage mit
month() und dayofmonth() abzufragen.

Ich habe eine Tabelle in der unter anderem auch eine Datumsfeld liegt.
Um nicht viel zu Strukturen schreiben zu müssen, die eh keinen
interessieren nehmen wir an, es seien sowas wie Geburtstage und ich
brauche die von heute. Den ganzen Tag lang werden immer wieder relativ
komplexe Abfragen auf die Datenbank losgelassen, die unter anderem
jedesmal month() und dayofmonth() abfragen.

Bin am überlegen, ob ich nicht ein zusätzliches Feld einfügen soll,
das einmal zu Beginn des Tages gefüllt wird und dann quasi für den
Rest des Tages eine 1 enthält, bei allen die heute Geburtstag haben
(um beim Beispiel zu bleiben). Davon verspreche ich mir einen kleinen
Performancevorteil.

Aber vielleicht ist das Datumsfeld von MySql ja so gestaltet, dass das
überflüssig ist. Kann mir dazu jemand etwas sagen? Wie gesagt mir geht
es um Treffer nach Datum, bei denen das Jahr unterschiedlich sein
kann.

Vielen Dank und viele Grüße
Thomas

Re: Datumsabfrage Jahrestage

am 04.12.2007 15:57:39 von Christian Kirsch

Thomas Poppner schrieb:

> Bin am überlegen, ob ich nicht ein zusätzliches Feld einfügen soll,
> das einmal zu Beginn des Tages gefüllt wird und dann quasi für den
> Rest des Tages eine 1 enthält, bei allen die heute Geburtstag haben
> (um beim Beispiel zu bleiben). Davon verspreche ich mir einen kleinen
> Performancevorteil.
>

Hast Du denn einen Performance*nach*teil beobachtet? Was hat Dir EXPLAIN
verraten?

> Aber vielleicht ist das Datumsfeld von MySql ja so gestaltet, dass das
> überflüssig ist. Kann mir dazu jemand etwas sagen? Wie gesagt mir geht
> es um Treffer nach Datum, bei denen das Jahr unterschiedlich sein
> kann.

Vielleicht ist es ja auch so, dass hier eine Lösung auf der Suche nach
einem Problem ist?

Wenn nicht, wäre es wohl sinnvoll, statt all der Prosa ein paar harte
Fakten zu posten: Die fraglichen Queries, die Ausgabe von SHOW CREATE
TABLE, das Ergebnis von EXPLAIN - und natürlich ein paar Daten zu den
Datenmengen, Anzahl der Abfragen pro Tag.

Re: Datumsabfrage Jahrestage

am 04.12.2007 16:01:10 von Claus Reibenstein

Thomas Poppner schrieb:

> kann mir jemand sagen, wie sinnvoll es ist, häufig Jahrestage mit
> month() und dayofmonth() abzufragen.

Ist das jetzt eine Frage? ;-)

Klare Antwort: Kommt darauf an, was genau Du erreichen möchtest.

> Ich habe eine Tabelle in der unter anderem auch eine Datumsfeld liegt.
> [...] Den ganzen Tag lang werden immer wieder relativ
> komplexe Abfragen auf die Datenbank losgelassen, die unter anderem
> jedesmal month() und dayofmonth() abfragen.

Nur abfragen oder auch danach selektieren/sortieren?

> Bin am überlegen, ob ich nicht ein zusätzliches Feld einfügen soll,
> das einmal zu Beginn des Tages gefüllt wird und dann quasi für den
> Rest des Tages eine 1 enthält, bei allen die heute Geburtstag haben
> (um beim Beispiel zu bleiben). Davon verspreche ich mir einen kleinen
> Performancevorteil.

Das kommt drauf an. Wenn die Werte nur abgefragt werden, sehe ich da
keinen Performancevorteil. Im Gegenteil: Die Bestimmung des Monats und
des Tages aus dem Datum ist eine derart simple Funktion, dass die
Abfrage einer zusätzlichen Spalte wohl eher bremsen statt beschleunigen
dürfte.

Anders sieht es aus, wenn Du nach diesen Werten selektieren und/oder
sortieren willst. Dann könnte eine zusätzliche indizierte (!) Spalte
sich durchaus positiv auf die Performance auswirken.

Gruß. Claus

Re: Datumsabfrage Jahrestage

am 04.12.2007 16:19:00 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

Re: Datumsabfrage Jahrestage

am 04.12.2007 18:33:58 von Christian Kirsch

Andreas Kretschmer schrieb:
> begin Claus Reibenstein schrieb:
>> Anders sieht es aus, wenn Du nach diesen Werten selektieren und/oder
>> sortieren willst. Dann könnte eine zusätzliche indizierte (!) Spalte
>> sich durchaus positiv auf die Performance auswirken.
>
> Wozu eine redundate Spalte?
>
> test=*# create table p (datum date);
> CREATE TABLE
> test=*# create index idx_p_datum on p (extract(month from datum), extract(day from datum));
> CREATE INDEX
> test=*# \d p
> Table "public.p"
> Column | Type | Modifiers
> --------+------+-----------
> datum | date |
> Indexes:
> "idx_p_datum" btree (date_part('month'::text, datum), date_part('day'::text, datum))
>
>
>
> Dafür hat man funktionale Indexe, oder? *g*

Meinst Du jetzt, dass funktionale Indizes eine Lösung auf eine
Performance-Problems sind - oder nicht doch eher ein Teil des Problems?
Ich habe mich neulich mal mit einem Oracle-Fan unterhalten, der davon
recht wenig hielt - bremst zu stark bei Aktualisieren.

Re: Datumsabfrage Jahrestage

am 04.12.2007 18:56:20 von Andreas Kretschmer

Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)