B
Bitz683
Mitglied
- Dabei seit
- 30.06.2006
- Beiträge
- 10
- Reaktionspunkte
- 0
Guten Tag zusammen,
habe mal wieder ein Problem mit dem SQL Zeugs. Auf einer WebSite wird für User
die Hits gespeichert. Pro klick ein Datensatz in der Tabelle Hits. Es soll nun für
die Administratoren die Möglichkeit geben eine Statistik eines frei wählbaren Zeit
raums auszugeben.
Das Problem dabei ist nun, das die Abfrage solange dauert, dass der SQL-Server
nachdem Timeout stribt.
Die Tabelle hat die Felder
Id int PK
org char(5)
lan char(5)
NavigationId int
Name varchar(255)
inputdate datetmie
Jahr int
Monat int
Tag int
Datum int
Ich hatte zuerst das Datum anhand des Feldes InputDate eingeschränkt. Dazu
musste ich es erst convertieren um die Zeit abzuschneiden und habe es an-
schliesen wieder zu Datetime convertiert. selbes auch mit dem übergebenen
Datum (jedoch ohne vorher die zeitabzuscheiden)
convert(datetime, convert(varchar(10), InputDate), 104)
=, >=, <=, <, >
convert(datetime, DatumVon )
Sowie entsprechnd mit DatumBis. Erg dabei: Timeout selbst bei einer Differenz
von einer Woche.
Drum die Felder Jahr, Monat und Tag. Hierbei kann ich bereit einen Zeitraum
von einem Monat auswählen und die Abfrage bracuht nur ca. 15 sec.
Problem evtl. dabei Ich habe bei einem großen Zeitraum in der Where-Klausel
relativ viele Einschränkungen.
(
(Jahr = 2007 and Monat = 5 and Tag > 15)
or
(Jahr = 2007 and Monat > 5)
or
(Jahr = 2008)
)
Wenn wir nun das Jahr 2010 haben kommen eben für 2009 und 2010 weitere
Einschränkungen dazu. Noch mehr sind es wenn ich das Bis Datum noch ein-
schränke.
Drum meinte ich, dass die Lösung über das Feld Datum kommt. Jedoch habe
dabei sogar das Problem, dass das Statement noch langsamer ist. Was ich
nicht verstehe
Bei meinen Tests habe ich dabei unterschiedliche Indexe auf die Tabelle gelegt
einmal auf Org und Lan sowie auf Jahr, Monat und Tag.
dann einen auf Org und Lan sowie Datum
einen auf Org und Lan sowie auf InputDate.
Schnellste Ergebnis brachte mir die Abfrage über Jahr, Monat und Tag und
einem Index auf die Felder Org, Lan, Jahr, Monat, Tag ( also ein index und
nicht zwei) Zeitraum zum test war ein Monat. Result kam nach ca. 15. sec
Achso und von der Datenmenge her. Es kommen kommen ca. 300000 Daten-
sätze pro Monat dazu. Derzeit sind ca. 4,5 Mio enthalten.
Nun zu meinem eigentlichen Anliegen: wie muss ich die Tabelle aufbauen, um
diese möglichst schnell abfragen zu können. Habe ich die Indexe falsch er-
stellt.
Ich hoffe ich habe mein Problem so beschrieben das mans auch versteht und
hoffe auf Hilfreiche Antworten
Vielen Dank mal
Gruß Bitz
habe mal wieder ein Problem mit dem SQL Zeugs. Auf einer WebSite wird für User
die Hits gespeichert. Pro klick ein Datensatz in der Tabelle Hits. Es soll nun für
die Administratoren die Möglichkeit geben eine Statistik eines frei wählbaren Zeit
raums auszugeben.
Das Problem dabei ist nun, das die Abfrage solange dauert, dass der SQL-Server
nachdem Timeout stribt.
Die Tabelle hat die Felder
Id int PK
org char(5)
lan char(5)
NavigationId int
Name varchar(255)
inputdate datetmie
Jahr int
Monat int
Tag int
Datum int
Ich hatte zuerst das Datum anhand des Feldes InputDate eingeschränkt. Dazu
musste ich es erst convertieren um die Zeit abzuschneiden und habe es an-
schliesen wieder zu Datetime convertiert. selbes auch mit dem übergebenen
Datum (jedoch ohne vorher die zeitabzuscheiden)
convert(datetime, convert(varchar(10), InputDate), 104)
=, >=, <=, <, >
convert(datetime, DatumVon )
Sowie entsprechnd mit DatumBis. Erg dabei: Timeout selbst bei einer Differenz
von einer Woche.
Drum die Felder Jahr, Monat und Tag. Hierbei kann ich bereit einen Zeitraum
von einem Monat auswählen und die Abfrage bracuht nur ca. 15 sec.
Problem evtl. dabei Ich habe bei einem großen Zeitraum in der Where-Klausel
relativ viele Einschränkungen.
(
(Jahr = 2007 and Monat = 5 and Tag > 15)
or
(Jahr = 2007 and Monat > 5)
or
(Jahr = 2008)
)
Wenn wir nun das Jahr 2010 haben kommen eben für 2009 und 2010 weitere
Einschränkungen dazu. Noch mehr sind es wenn ich das Bis Datum noch ein-
schränke.
Drum meinte ich, dass die Lösung über das Feld Datum kommt. Jedoch habe
dabei sogar das Problem, dass das Statement noch langsamer ist. Was ich
nicht verstehe
Bei meinen Tests habe ich dabei unterschiedliche Indexe auf die Tabelle gelegt
einmal auf Org und Lan sowie auf Jahr, Monat und Tag.
dann einen auf Org und Lan sowie Datum
einen auf Org und Lan sowie auf InputDate.
Schnellste Ergebnis brachte mir die Abfrage über Jahr, Monat und Tag und
einem Index auf die Felder Org, Lan, Jahr, Monat, Tag ( also ein index und
nicht zwei) Zeitraum zum test war ein Monat. Result kam nach ca. 15. sec
Achso und von der Datenmenge her. Es kommen kommen ca. 300000 Daten-
sätze pro Monat dazu. Derzeit sind ca. 4,5 Mio enthalten.
Nun zu meinem eigentlichen Anliegen: wie muss ich die Tabelle aufbauen, um
diese möglichst schnell abfragen zu können. Habe ich die Indexe falsch er-
stellt.
Ich hoffe ich habe mein Problem so beschrieben das mans auch versteht und
hoffe auf Hilfreiche Antworten
Vielen Dank mal
Gruß Bitz