Thomas 'PointedEars' Lahn wrote:
> Man *kann* die von der SP erstellte Tabelle natürlich für zukünftige Nutzung
> bestehen lassen (d. h. kein DROP TABLE IF EXISTS und dafür ein INSERT … ON
> DUPLICATE).
Und für eine andere Fragestellung gibt es dann eine neue Tabelle?
> *Im Voraus* 800 Jahre Kalenderdaten zu speichern, nur um sie
> *irgendwann* *vielleicht* mal abzufragen, ist aber kompletter Blödsinn.
800 Jahre sind schon etwas viel, stimmt, das hab ich im Kalender auch
nicht immer drin. Aber die vorberechneten Daten im *meinem* Kalender
stehen da drin, *weil* ich sie immer wieder brauche und da gehört ein
Wochentag etc. dazu.
> Zumal Kalender auch gern mal während der Lebensdauer einer Datenbank
> angepasst werden (Stichworte: "Sommerzeit", "Schaltsekunde").
Bei einem Kalender mit Schaltsekunden oder der Sommerzeit zu
argumentieren ist schlicht Themaverfehlung, da ein Kalender auf der
Basis von Tagen aufgebaut ist.
Übrigens, Wochennummer u.ä. werden während der Lebensdauer einer
Datenbank nicht angepasst, ich geh davon aus, dass 2012-01-13 auch in
übersehbarer Zukunft der zweite Freitag des Monats Januar in der
KW201202 bleiben wird.
>> Die eingebauten Datumsfunktionen sind ganz nett, wenn ich nur für die
>> Ausgabe eine Berechnung brauche.
>
> Wie kommst Du eigentlich darauf, dass hier etwas anderes gesucht war?
Für mich ist "Ausgabe" = Spaltenliste im Select.
"wie viele Dienstage im Jahr auf den 14. fallen" ist aber eine Bedingung
und die gehört in's WHERE.
>> Bei einer Bedingung wie "Alle Daten aus der Wochen 2010W52" auf grossen
>> Datenmengen ist ein Join auf einen Kalender besser, der gibt vor allem dem
>> Optimizer Info über die Anzahl der Tage in dieser Woche, die er bei einer
>> direkten Berechnung nicht wissen kann. Dadurch kann er die weiteren
>> Arbeitschritte besser planen.
>
> Quatsch. JOINs sind so ziemlich die langsamsten Datenbankoperationen, die
> es gibt. Insbesondere bei einer grossen Datenbasis.
Nochmal, es ist hilfreich für den Optimizer, wenn er die Kardinalität
einer Bedingung kennt. Da Joins aufwendig sind, muss ein Optimizer aus
verschiedenen internen Möglichkeiten die auswählen, welche für diese
Datenmenge die effizienteste ist. Bei Berechnungen hat er aber Probleme,
diese Kardinalität abzuschätzen: solange er zuviele Rows annimmt, ist
das meist kein Problem, es gibt aber Jointypen, die sehr effizient bei
einer kleinen Datenmenge sind, aber bei grösseren Mengen absolut mies.
Und das ist vor allem bei grosser Datenbasis wichtig.
> JOINs *vermeidet* man
> (es sei denn, sie dienen der Effizienz gegenüber WHERE-Ausdrücken),
Meinst du WHERE mit (korrelierten) Subqueries?
Die sind je nach DBMS und Fragestellung sogar effizienter als Joins.
> und
> provoziert sie nicht noch zusätzlich durch derart extremen Overhead!
>
>>> Anders formuliert: In einer
>>> Termindatenbank erstellt man _nicht_ für jedes mögliche Datum einen
>>> Datensatz und befüllt den bei Vorliegen eines Termins mit Textdaten,
>>> sondern man erstellt für jeden *Termin* einen Datensatz mit dem
>>> entsprechenden
>>> Datumswert. Keine Termine, keine Datensätze.
>>
>> Du sprichst von einer Termindatenbank, ich von einem Kalender.
>
> Einen Kalender, in dem Termine gespeichert werden sollen, implementiert im
> Backend üblicherweise als Termindatenbank. Einen Kalender, der "einfach nur
> da" ist, implementiert man *gar* *nicht* als Datenbank.
Du sprichst von einer Termin*datenbank*, ich von einer Kalender*tabelle*.
Ein Kalender ist eine *Tabelle* und keine *Datenbank*.
Eine Termindatenbank kann allerdings ziemlich komplex sein mit diversen
Tabellen.
>> Ausserdem, wie erstellt du denn aus der Termindatenbank eine Ausgabe mit
>> allen Datumswerten (auch die, für die es kene Termine gibt) für einen
>> bestimmten Bereich ohne einen Left Join auf einen Kalender?
>
> Gar nicht. Für den unwahrscheinlichen Fall, dass ich wissen muss, an
> welchen Tagen es *keine* Termine gibt (der Normalfall ist das Gegenteil,
> d. h. z. B. das Array der Termine für einen Tag an dem nichts los ist, ist
> einfach leer), könnte ich zur Not immer noch einen JOIN machen.
Ein "Array der Termine"? Sprichst du jetzt "SQL/Datenbank" oder PHP?
Und wohin joinst du "zur Not"? Etwa zu einer Kalendertabelle?
> Im Normalfall brauche ich dafür aber schon mal gar keine Datenbankabfrage,
> denn wie gesagt, das Array für den jeweiligen Tag ist leer (bzw. für den Tag
> gibt es gar kein Element im übergeordneten Array, was un Abhängigkeit vom
> Zeitraum noch effizienter sein kann), da ich zuvor die Arrays aller Tage im
> relevanten Zeitraum (z. B. aktuellen Monat) mit den gespeicherten Terminen
> gefüllt habe.
Ok, du sprichst doch von PHP o.ä., das tangiert mich äusserst peripher,
ich dachte, hier wäre de.comp.*datenbanken*.mysql
>>> Mit einer Stored Procedure bei Bedarf eine temporäre Tabelle zu
>>> erstellen, die die Wochentage aller 14. speichert, dauert höchstens ein
>>> Millionstel der Zeit, und benötigt einen ebensolchen Anteil
>>> Speicherplatz, als eine wie auch immer geartete "Kalendertabelle".
>>
>> Willst du jedesmal, wenn "irgendsoeine" Datums-Berechnung gemacht werden
>> soll, eine entsprechende SP ausführen, die auch noch passend geschrieben
>> werden muss
>
> *Einmal* schreibt man die SP, und eher *selten* führt man sie aus, ja.
Ich kenn das eher so, dass man eine SP schreibt, weil man sie *häufig*
ausführen will.
>> und die ich nicht joinen kann?
>
> Wie bitte? Die SP erstellt einfach eine Tabelle. Mit der kannst Du machen
> was Du willst. Die SP kann so geschrieben werden, dass die Tabelle, die sie
> erstellt, mehreren Use-Cases dient (z. B. speichere ich nicht [nur] den
> Wochentag, sondern [auch gleich noch] das Datum). Und für Spezialfälle
> erstellt man einfach eine zweite, dritte usw. SP. Die erstellt man dann
> auch nur *einmal*.
Auf eine SP kann ich nicht joinen (wobei es DBMSe gibt, die das auch
können). Dass ich natürlich erstmal einen CALL machen kann und dann im
nächsten Schritt auf die gerade erzeugte Tabelle zugreifen kann, ist
aber was anderes.
Und wenn du dann für die Use-Cases die Tabelle erweitert hast und für
die Spezialfälle deine SPs weitere Tabellen angelegt haben, wirst du
vielleicht feststellen, dass ein Kalender mit dem ganzen Zeug drin gar
nicht so schlecht ist?
> BTDT.
>>
>> Glaub ich dir.
>> Dann bin ich wohl woanders gewesen, denn da ist dieser "grobe Unfug"
>> Standard.
>
> Das glaube ich Dir nicht. Nicht mal der Kalender von Rausguck (Exzess) ist
> so abgrundtief bescheuert programmiert!
Was hat der Outlook-Kalender damit zu tun?
Isch 'abe Microsoft gar nicht als Kunde.
Wenn du mir nicht glauben willst, sollen wir dann unsere Kundenlisten
rausholen und einen Längenvergleich machen?
>>>> Und da habe ich hoffentlich schon den Wochentag (neben
>>>> Feiertagen/Wochennummern/Geschäftsjahren etc.) vorberechnet oder wenn
>>>> nicht, dann eben direkt mit:
>>>> select count(*)
>>>> from kalender
>>>> where jahr = xxx
>>>> and DAYOFMONTH(datum) = 14
>>>> and DAYOFWEEK(datum) = 3
>>>
>>> Du hast entweder nicht den Hauch der Spur einer Ahnung, worüber Du
>>> schreibst, oder Du hast die Fragestellung schlicht nicht verstanden.
>>
>> Wieso? Mein Beispiel auf einer Kalendertabelle berechnet genau das
>> Gewünschte für ein Jahr (nur in meinem Kalender bräuchte ich die
>> Funktionen nicht, da das schon vorberechnet wurde):
>> "wie viele Dienstage im Jahr auf den 14. fallen"
>> -> DAYOFMONTH(datum) = 14 and DAYOFWEEK(datum) = 3
>>
>> Und falls es mehr als ein Jahr sein soll, dann eben eine entsprechende
>> WHERE-Bedingung und "GROUP BY Jahr".
>
> Bitte hinlesen und Gehirn einschalten! Du willst gigabyteweise
"gigabyteweise"
Bitte Gehirn einschalten und einfach mal grosszügig rechnen:
Ich hab also jede nur vorstellbare Berechnung für ein Datum gemacht und
den Datensatz pro Tag auf unwahrscheinliche 1000 Bytes aufgeblasen, dann
hab ich bei 2727 Jahren im Kalender *ein* GB erreicht.
> Kalenderdaten in der Datenbank speichern für den unwahrscheinlichen Fall,
> dass Du mal wissen willst, wieviele 14. in diesem Jahr auf einen Dienstag
> fallen (und ähnliches)?
Der OP wollte das wissen, ich nicht, aber mit einem Kalender kann ich
selbst sowas Hausaufgabenmässiges mit einer einfachen Abfrage rausholen.
Für mich gibt es eher Bedingungen wie
- vergleiche die Daten der beiden Wochen um Ostern der letzten drei Jahre
- duchschnittliche Umsätze am 1. Samstag des Monats des letzten halben
Jahres
- berechne die Anzahl von Geschäftstagen zwischen Start- und Endedatum
unter Einbeziehung von Feiertagen etc. Aber nicht für eine Row, sondern
zig-Millionen, weil du den Mittelwert brauchst.
> kopfschüttelnd,
kenn ich, das kommt von der lauten Musik...
Dieter