PHP / SQL optimieren. (SELECT / INSERT über ODBC)

  • Themenstarter Themenstarter Futzel
  • Beginndatum Beginndatum
F

Futzel

Hi,

kann mir jemand beim optimieren folgendes Codes helfen?
Dieser Code benötigt fürs migrieren von 300.000 Datensätze ca. 6 Stunden. Das ist mir viel zu lang.
Wie und Was kann ich tun, damit das Skript schneller wird?

PHP:
$dsn = "flsincsql";
$dsn2 = "flsincsqlneu";
$conn = odbc_connect($dsn, "", "") or die("Fehler beim Datenbankaufruf ".odbc_errormsg()." für ODBC-Quelle ".$dsn);
$conn2= odbc_connect($dsn2, "", "") or die("Fehler beim Datenbankaufruf ".odbc_errormsg()." für ODBC-Quelle ".$dsn2);


$sql = "SELECT  * FROM Incidents";
$run = odbc_exec($conn, $sql);
$result = odbc_fetch_array($run);

if($result)
{	
	$count = 0;
	do //Schleife über alle in der Datenbank gefundenen Einträge
	{ 
		//FKs ermitteln
		$sqlincidentstatus_id = "SELECT ID FROM Incidentstatus WHERE Status='".$result["Incidentstatus"]."'";
		$resultstatus_id = odbc_exec($conn2, $sqlincidentstatus_id);
		$incidentstatus_id = odbc_result($resultstatus_id,"ID");
		
		$sqlmitarbeiter_id= "SELECT ID FROM Mitarbeiter WHERE nimbus_id='".$result["Bearbeiter"]."'";
		$resultmitarbeiter_id = odbc_exec($conn2, $sqlmitarbeiter_id);
		$mitarbeiter_id = odbc_result($resultmitarbeiter_id,"ID");
	
		$sqlkategorie_id = "SELECT ID FROM Kategorien WHERE Kategorie='".$result["Kategorie"]."'";
		$resultkategorie_id = odbc_exec($conn2, $sqlkategorie_id);
		$kategorie_id = odbc_result($resultkategorie_id,"ID");

		$sqlakt_status_id = "SELECT ID FROM Akt_Status WHERE Status='".$result["Aktion"]."'";
		$resultstatus_id=odbc_exec($conn2, $sqlakt_status_id);
		$akt_status_id = odbc_result($resultstatus_id,"ID");

		$sqlxxx_id = "SELECT ID FROM xxx_ID WHERE xxx_id='".$result["Incident"]."'";
		$resultxxx_id = odbc_exec($conn2, $sqlxxx_id);
		$xxx_id = odbc_result($resultxxx_id,"ID");

		$sqlinsert = "INSERT INTO Incidents (Incidentstatus_ID,Bearbeiter_ID,Kategorien_ID,Aktion_ID,Incident_ID,Datum,Vermerk,Aufwand,Reklamation,Direktloesung,Rekla_gerechtfertigt)
VALUES ('".$incidentstatus_id."','".$mitarbeiter_id."','".$kategorie_id."','".$akt_status_id."','".$xxx_id."','".$result["Datum"]."','".$result["Vermerk"]."','".$result["Aufwand"]."','".$result["Reklamation"]."','".$result["Direktlösung"]."','".$result["Rekla gerechtfertigt"]."')";
		
		$resultinsert=odbc_exec($conn2, $sqlinsert)or die("Datensatz konnte nicht migriert werden\n".odbc_error($conn2)." - ".odbc_errormsg($conn2)."");
		$count++;	
	
	} while ( $result=odbc_fetch_array($run));  // Ende Schleife über alle in der Datenbank gefundenen Einträge
	echo " Es wurden ".$count." Datensaetze nach Incidents migriert\n";
	
} else {
	echo "Kein Eintraege in Tabelle Incidents zum migrieren vorhanden\n";
}
 
Zuletzt bearbeitet von einem Moderator:
Ein INSERT INTO.. SELECT Statement das mit JOIN die Tabellen verbindet.

Ich habe hier mal ein gekürztes Version. Die restlichen Tabellen kannst du selber noch anbinden

Nur versteh ich nicht, warum du aus Incidents die Details zusammensuchst und dan dieses als neuen Datensatz in die Incidents schreiben willst.

SQL:
INSERT INTO Incidents (Incidentstatus_ID,Bearbeiter_ID)
SELECT  
	 Incidentstatus.id AS Incidentstatus_id,
	 Mitarbeiter.id AS mitarbeiter_id
FROM 
	Incidents
	INNER JOIN Incidentstatus
		ON Incidentstatus.status = Incidents.Incidentstatus
	INNER JOIN Mitarbeiter
		ON Mitarbeiter.nimbus_id = Incidents.Bearbeiter

Nachtrag:
Ah, 2 versch. Connections.
In dem Fall nimm das SELECT mit den JOINS und setze das INSERT weiterhin von Hand zusammen
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück