PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL-Abfrage vs Speichern in PHP-Array


mapel110
2008-04-07, 09:17:21
Gibts da irgendeine Regel, wann man was verwenden sollte?

Ich stehe gerade vor der Entscheidung, einen Datenbestand entweder mehrmals abzufragen oder eben zwischen zu speichern in einem PHP-Array.
Die Datenmenge kann dabei schon recht beträchtlich sein bei meiner Datenbank; ein Array aus 5 Strings mit mehreren tausend Ergebnissen.

Expandable
2008-04-07, 09:22:34
Selbst testen.

Generell dürfte aber die SQL-Variante schneller sein. PHP ist teilweise echt extremst lahm... wobei... was heißt "zwischenspeichern"? Über mehrere Page Requests? Falls im selben Request, dürfte wohl das Zwischenspeichern schneller sein.

mapel110
2008-04-07, 09:31:08
Ja, es wird alles auf einer Seite verarbeitet.

btw mir kommt gerade in den Sinn, ist nicht eh das komplette Ergebnis in der "$result" gespeichert? Mit mssql_fetch hab ichs dann ja sowieso in php und kann damit weiterarbeiten?!
Ich find das alles so verwirrend. :ugly:

Expandable
2008-04-07, 10:07:24
Ja. Deswegen war ich ja verwirrt bzgl. der mehreren Page Requests.

Siehe auch http://de2.php.net/manual/en/function.mysql-query.php

mapel110
2008-05-07, 09:25:50
*bump*
Ich habe jetzt im Programm ca 21 Abfragen. Und das dauert so lange, dass er über 4 Minuten braucht. Das ist für meinen Cheffe zu viel (und ich bekomme PHP-Timeouts).
14 der Abfragen sind quasi überflüssig, aber die habe ich drin, um mir Arbeit in PHP zu ersparen. Ich lasse nämlich einmal nach Stunden, dann nach Tagen und auch noch nach Monaten gruppieren, so dass ich eben die jeweiligen Anzahlen an Datensätze bekomme.
Ich könnte natürlich mich jetzt auf Stundenweise-Gruppieren beschränken und dann irgendwas in PHP frickeln. Aber das will ich mir ersparen.

Gibts noch irgendeine Möglichkeit, Daten vorab nach Monaten,Tagen und Stunden zählen zu lassen via SQL in einer Abfrage?

/edit
Und noch eine Frage: Was ist schneller? Suchen via IN oder via LIKE?

WHERE bla IN $in
$in ist eine Liste, wo eben die Daten zum Abgleich drin stehen ('xxxx','xxxx','xxxx','xxxx ....

oder

WHERE
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
bla LIKE xxxx
... bis zu mehrere hundert LIKEs wären dann maximal drin in der Abfrage bzw würden in $in drin stehen je nach Lösungsweg.

/edit
Ich glaub, das hilft mir weiter
http://www.4guysfromrolla.com/webtech/102704-1.shtml
SELECT
CASE
WHEN GROUPING(Department) = 1 THEN 'Company Average'
ELSE Department
END AS Department,
AVG(Salary) as AvgSalary
FROM Employees
GROUP BY Department
WITH ROLLUP

mal testen....

mapel110
2008-05-07, 13:28:47
SELECT
xxxxx,
datepart(hh,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')) AS Stunde,
datepart(dd,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')) AS Tage,
datepart(mm,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')) AS Monate,
datepart(yyyy,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')) AS Jahre,
COUNT(*) AS Anzahl,
yyyyyy
FROM
aaaaaa
WHERE
blablubb
GROUP BY
yyyyyy,
xxxxxx,
datepart(yyyy,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')),
datepart(mm,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')),
datepart(dd,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00')),
datepart(hh,DATEADD(ss, dateTimeOrigination,'01.01.1970 01:00'))
ORDER BY
yyyy ASC,
xxxxx ASC,
Jahre ASC,
Monate ASC,
Tage ASC,
Stunde ASC
---------------------------
So siehts bisher aus. Er zählt also die Datensätze pro Stunde. Zusätzlich will ich aber auch das Ergebnis pro Tage, pro Monate und pro Jahre.
Mit dem GROUPING scheint ein imo guter Ansatz zu sein, aber ich hab dafür noch keine guten Beispiele gefunden.
/edit
Okay, ich kann das glaube ich vergessen. Weil mal logisch überdacht "Wo sollte er auch das Ergebnis für Tage, Monate und Jahre speichern? Er gruppiert pro Stunde, also hat er Datensätze pro Stunde und naja... geht wohl nicht. auf zur PHP-Lösung.... :(