Verschachtelte Abfrage

Hallo Leute,

Ich habe hier ein mittelgroßes Performanceproblem. Meine Datenbank ist etwa 20 Mbyte groß (MySQL 4) und enthält Zugriffe auf Webseiten.

Wenn ich mir jetzt einen Tag anschauen will, dauert es etwa 1 Minute bis alle Daten geladen sind. Es sind etwa 100 Benutzer am Tag, insgesamt etwa 700 bis 1000 Einträge also. Das ganze mache ich mit JSP, aber ich denke hier bin ich richtiger als im Java-Brett.

Also ich möchte das gerne folgendemassen sortieren:

zuerst nach Nutzernummer und als zweites nach der Zugriffszeit. Ausserdem hole ich mir aus einer anderen Tabelle noch weitere Informationen über die einzelnen Nutzer:

select user 
from besucherstatistik 
where zeit \>='2005-06-21 0:00:00' 
and zeit 
Dieses ergibt die oberste Schleife. Sie läuft so oft durch, wie es user gibt. Ich habe es auch schon mit distinct versucht, nutzt nichts.

Dann bekomme ich alle Nutzer des Tages angezeigt. Jetzt laufe ich diese Ergebnisse durch und hole mir jeweils einmal aus einer anderen Tabelle Informationen:


    select ip 
    from besucherinfo 
    where user=


Und dann hole ich mir als innere Schleife alle Aufrufe des Nutzers


    select \* 
    from besucherstatistik 
    where zeit \>='2005-06-21 0:00:00' 
    and zeit 
    order by zeit


Ich weiss hier nicht mehr so richtig weiter. Im Taskmanager ist die Prozessorauslastung von MySQL enorm hoch, wenn ich so eine Abfrage fahre.

Ich habe mal was gelernt, dass man eine Abfrage als neue temporäre Tabelle benutzen kann. Aber das klappt so nicht. Ich hatte vor, um das Datenvolumen zu verkleinern, dass ich als erstes eine Abfrage mache:


    select \* 
    from besucherstatistik 
    as temptable 
    where zeit \>='2005-06-21 0:00:00' and zeit 
    Und danach nur noch folgende Abfragen mache:
    
    
        select user 
        from temptable 
        group by user 
        order by user
    
    
    Das sollte ja dann schneller gehen, weil eben nicht mehr 200.000 Einträge durchsucht werden, sondern nur noch 1000. Aber wie gesagt, das klappt so nicht, da sagt er mir, dass es temptable nicht gibt.
    
    Weiß einer Rat?
    
    danke euch, 
    
    der Günther

Hallo Leute,

Ich habe hier ein mittelgroßes Performanceproblem. Meine
Datenbank ist etwa 20 Mbyte groß (MySQL 4) und enthält
Zugriffe auf Webseiten.

Die DB ist winzig.

Wenn ich mir jetzt einen Tag anschauen will, dauert es etwa 1
Minute bis alle Daten geladen sind. Es sind etwa 100 Benutzer
am Tag, insgesamt etwa 700 bis 1000 Einträge also. Das ganze
mache ich mit JSP, aber ich denke hier bin ich richtiger als
im Java-Brett.

Also ich möchte das gerne folgendemassen sortieren:

zuerst nach Nutzernummer und als zweites nach der
Zugriffszeit. Ausserdem hole ich mir aus einer anderen Tabelle
noch weitere Informationen über die einzelnen Nutzer:

select user
from besucherstatistik
where zeit >=‚2005-06-21 0:00:00‘
and zeit
Dieses ergibt die oberste Schleife. Sie läuft so oft durch,
wie es user gibt. Ich habe es auch schon mit distinct
versucht, nutzt nichts.

Das verstehe ich nicht. Willst Du jetzt alle user:
SELECT DISTINCT user
FROM besucherstatistik
WHERE zeit >=‚2005-06-21 0:00:00‘
and zeit select ip

from besucherinfo
where user=
Und dann hole ich mir als innere Schleife alle Aufrufe des
Nutzers

select *
from besucherstatistik
where zeit >=‚2005-06-21 0:00:00‘
and zeit
order by zeit

Du machst hier eine Schleife in der Applikation - nicht in der DB.

SELECT bs.*, bi.ip
FROM besucherstatistik bs, besucherinfo bi
WHERE bs.user = bi.user
AND bs.zeit >=‚2005-06-21 0:00:00‘
AND bs.zeit select *

from besucherstatistik
as temptable
where zeit >=‚2005-06-21 0:00:00‘ and zeit
Und danach nur noch folgende Abfragen mache:

select user
from temptable
group by user
order by user

Das sollte ja dann schneller gehen, weil eben nicht mehr
200.000 Einträge durchsucht werden, sondern nur noch 1000.
Aber wie gesagt, das klappt so nicht, da sagt er mir, dass es
temptable nicht gibt.

Weiß einer Rat?

danke euch,

der Günther

Hallo Leute,

Hi

Ich habe hier ein mittelgroßes Performanceproblem. Meine
Datenbank ist etwa 20 Mbyte groß (MySQL 4) und enthält
Zugriffe auf Webseiten.

Wenn ich mir jetzt einen Tag anschauen will, dauert es etwa 1
Minute bis alle Daten geladen sind. Es sind etwa 100 Benutzer
am Tag, insgesamt etwa 700 bis 1000 Einträge also. Das ganze
mache ich mit JSP, aber ich denke hier bin ich richtiger als
im Java-Brett.

Also ich möchte das gerne folgendemassen sortieren:

zuerst nach Nutzernummer und als zweites nach der
Zugriffszeit. Ausserdem hole ich mir aus einer anderen Tabelle
noch weitere Informationen über die einzelnen Nutzer:

select user
from besucherstatistik
where zeit >=‚2005-06-21 0:00:00‘
and zeit
Dieses ergibt die oberste Schleife. Sie läuft so oft durch,
wie es user gibt. Ich habe es auch schon mit distinct
versucht, nutzt nichts.

Dann bekomme ich alle Nutzer des Tages angezeigt. Jetzt laufe
ich diese Ergebnisse durch und hole mir jeweils einmal aus
einer anderen Tabelle Informationen:

select ip
from besucherinfo
where user=

Und dann hole ich mir als innere Schleife alle Aufrufe des
Nutzers

select *
from besucherstatistik
where zeit >=‚2005-06-21 0:00:00‘
and zeit
order by zeit

Ich weiss hier nicht mehr so richtig weiter. Im Taskmanager
ist die Prozessorauslastung von MySQL enorm hoch, wenn ich so
eine Abfrage fahre.

Ich habe mal was gelernt, dass man eine Abfrage als neue
temporäre Tabelle benutzen kann. Aber das klappt so nicht. Ich
hatte vor, um das Datenvolumen zu verkleinern, dass ich als
erstes eine Abfrage mache:

select *
from besucherstatistik
as temptable
where zeit >=‚2005-06-21 0:00:00‘ and zeit
Und danach nur noch folgende Abfragen mache:

select user
from temptable
group by user
order by user

Das sollte ja dann schneller gehen, weil eben nicht mehr
200.000 Einträge durchsucht werden, sondern nur noch 1000.
Aber wie gesagt, das klappt so nicht, da sagt er mir, dass es
temptable nicht gibt.

Warum nicht einfach :
SELECT * FROM besucherstatistik INNER JOIN besucherinfo ON besucherstatistik.user = besucherinfo.user WHERE zeit >=‚2005-06-21 0:00:00‘ AND zeit

Hallo Leute,

kenne mich nur (leider nur etwas) in SQL aus, dürfte aber unter MySql ähnlich sein.

Es gibt das Konstruct des Cursors, in den man per Select Daten stellt, den man dann durchlaufen kann:
DECLARE mCur cursor local FORWARD_ONLY FOR
SELECT parentId FROM aaAssign
WHERE assignId=@nodeId AND context=‚activity‘
AND RIGHT(parentId,1)=‚A‘
FOR READ ONLY
OPEN mCur

FETCH NEXT FROM mCur INTO @id
WHILE @@FETCH_STATUS = 0
BEGIN

FETCH NEXT FROM mCur INTO @id
END

Alternativ eine Tabelle erzeugen:
CREATE TABLE @m(id nvarchar(255), displayId nvarchar(255))
Die kannst du dann füllen.
insert @m
select id, dispId from aa
where (nummer = @nummer)

Ideal scheint mir aber ein Join zu sein. Mit dem kannst du zwei Tabellen „verbinden“ und quasi wie eine Tabelle abfragen.

SELECT a.Id,a.Titel, a.Nummer,a.attachment, a.nummer as displayNo
FROM Tabelle1 AS a
left JOIN Tabelle2 AS b ON a.id = b.procedureId
where
(@userTime