Script schneller machen

hikeda_ya

Erfahrenes Mitglied
Hey Leute,

mit dem folgenden Script lasste ich meinen W2k3 Server teils bis zu 100% mit IIS und MS-SQL aus. Zudem braucht es rund 15 Minuten bis das Ergebniss vollständig da ist.

Geht das nicht auch anders pervormanter?

PHP:
$res = sql ("
 select firmen_id, firma from interessant
where lkz = 'D' and firmen_id not in (select f_id from dubletten)
order by lkz, plz");
				
echo '<table border=1>
<tr>
<td bgcolor="#c0c0c0">id</td>
<td bgcolor="#c0c0c0">anrede</td>
<td bgcolor="#c0c0c0">titel</td>
<td bgcolor="#c0c0c0">akad</td>
<td bgcolor="#c0c0c0">vname</td>
<td bgcolor="#c0c0c0">nname</td>
<td bgcolor="#c0c0c0">funktion</td>
</tr>';

while ($row = mssql_fetch_assoc ($res)){
$fid[$row['firma']] = $row['firmen_id'];}	
					
foreach ($fid as $fir => $nam){

$res = sql ("select id, vname, nname, anrede, titel, akad, funktion from namen
where firmen_id = $nam and funktion = 'Techn. Leiter'
group by firmen_id, nname, vname, anrede, titel, akad, funktion, id
order by id");
 
Zuletzt bearbeitet:
Ich kenne mich leider gar nicht mit dem IIS/MSSQL aus, hätte aber eine Frage: Wie hoch ist denn der Datenbestand der durchsucht wird bei der Query ?
 
Wie sieht denn deine Tabellenstruktur aus?
Sind die Indexe günstig gesetzt?

SQL:
select firmen_id, firma from interessant
where lkz = 'D' and firmen_id not in (select f_id from dubletten)
order by lkz, plz
Ist grundsätzlich langsam.

Gehen wir davon aus, dein Query geht 1000 Datensätze durch, werden zusätzlich 1000 Subselects gemacht.
Alleine dort könntest du durch eine vorherige Abfrage der f_ids optimieren.
 
sind insgesammt 2 Tabellen

1. Tabelle Namen ~ 130.000 Datensätze
2. Tabelle Dubletten ~ 4.000 Datensätze


Es sollen die Ansprechpartner die bei den Dubletten drinn sind nicht mehr gezogen werden. Daher muss ich sie ja mit dem firmen_id not in (select f_id from dubletten) herausfiltern. Das geht wohl schon recht schnell.

Aber der zweite Teil

$res = sql ("select id, vname, nname, anrede, titel, akad, funktion from namen
where firmen_id = $nam and funktion = 'Techn. Leiter'
group by firmen_id, nname, vname, anrede, titel, akad, funktion, id
order by id");


braucht unwarscheinlich lange - geht das nicht auch schneller

beim Versuch

PHP:
res = sql ("select id, vname, nname, anrede, titel, akad, funktion from namen
where firmen_id not in (select f_id from dubletten) and funktion = 'Techn. Leiter' and lkz = 'D'
group by firmen_id, nname, vname, anrede, titel, akad, funktion, id
order by id");

kam leider kein Ergebniss dabei heraus
 
Zuletzt bearbeitet:
Probier es mal durch Setzen eines Index auf "firmen_id", wobei ich da nicht ganz sicher bin, welche es bei MS SQL gibt.
 
wie ich bei einem MS-SQL / PHP Script eine Primärschlüssel-Beziehung herstelle weiss ich leider nicht. Ich kann zwar über den SQL-Server-Manager eine Beziehung herstellen nur wie ich diese in PHP nutze
 
Eigentlich garnicht. Beziehungen zwischen Primär- und Fremdschlüsseln musst du immer manuell nachbilden in deinen Abfragen. Führe deine SQL-Statements doch erstmal alleine im MSSQL Server aus und vergleiche erstmal die Dauer mit denen des PHP-Scripts. Der MSSQL Server sollte eigentlich automatisch auf Primär- und Fremdschlüssel Indexes setzen, ansonsten musst du mal in der Doku nachschauen!

PS: Müssen bei der 2. Abfrage so viele GROUP BY's gesetzt werden? Das könnte evtl. bremsen.
 
PHP selbst kümmert sich nicht darum, wie die Tabellenrelationen aussehen.

PHP stellt die Anfrage, SQL verarbeitet sie und gibt das Resultat zurück, worüber PHP sich freut.

SQL:
SELECT 
  id, 
  vname, 
  nname, 
  anrede, 
  titel, 
  akad, 
  funktion 
FROM namen
WHERE firmen_id NOT IN (
    SELECT f_id 
    FROM dubletten
) 
AND funktion = 'Techn. Leiter' 
AND lkz = 'D'
GROUP BY 
  firmen_id, 
  nname, 
  vname, 
  anrede, 
  titel, 
  akad, 
  funktion, 
  id
ORDER BY id

Nur mal als Beispiel für eine ordentliche Strukturierung. Es ist einfach besser lesbar.
Kommt denn wirklich kein Ergebnis raus oder gibt es einen Fehler?
 
Zurück