UPDATE-Anweisung mit PERL und MSSQL-Server
andi
- perl
Folgendes Problem.
Ich habe eine RIESIGE Tabelle mit ca. 80000 Sätzen.Diese muss ich koplett durchgehen und einige Zeichen ersetzen und dann wieder zurueckschreiben. Alles funktiniert rasend schnell, vor allen Dingen das auslesen der Tabelle. Das Ersetzen der Zeichen klappt auch ohne Probleme.Nur beim Zurueckschreiben der Saetze per UPDATE-Anweisung kommt es manchmal zu, fuer mich nicht nachvollziehbaren Wartezeiten. Auf einmal ist das Programm dann beendet mit einem fehlerfreien Statuscode, aber es wurden nur ca. 10 Datensaetze wirklich zurueckgeschrieben.Ich habe mal die Zeit gemessen, nach der sich das Programm fuer beendet erklaert, das sind meist so 31 bis 32 Sekunden.
Ich benutze PERL auf einem Windowssystem mit Win32::ODBC. Da man keine Fehlermeldung oder sonst irgendwas bekommt, weiss ich mir keinen Rat mehr.ICh bin mit dem Debugger auch mal das WIN32::ODBC mitgegangen, konnte da aber auch nichts erkennen.
Weiss jemand Rat?
Das Skript an sich ist auch nicht so gross, ich koennte das auch mal hier ins Forum stellen.
Danke Andreas
Hi,
Ich habe eine RIESIGE Tabelle mit ca. 80000 Sätzen.
ich muß mich sehr zurückhalten, um hier nicht "niedlich!" auszurufen ;-)
Diese muss ich koplett durchgehen und einige Zeichen ersetzen und dann wieder zurueckschreiben.
Also etwa
UPDATE tabelle SET spalte = REPLACE(spalte, 'a', 'b')
Alles funktiniert rasend schnell, vor allen Dingen das auslesen der Tabelle.
Index, vermute ich.
Das Ersetzen der Zeichen klappt auch ohne Probleme.
Machst Du das in der Programmlogik? Sofern möglich, solltest Du dies vermeiden.
Nur beim Zurueckschreiben der Saetze per UPDATE-Anweisung kommt es manchmal zu, fuer mich nicht nachvollziehbaren Wartezeiten.
Wenn Du _während_ des Auslesens die gleichen Datensätze zurückschreiben willst, muß das DBMS trotzdem jeden einzelnen Eintrag beim Schreiben neu suchen. Es müssen Transaktionen beachtet werden; möglicherweise werden die Datensätze dabei gelockt.
Weiss jemand Rat?
Ich kenne mich mit MSSQL nicht aus; aber wenn es eine Möglichkeit gibt, den Execution Plan anzeigen zu lassen, solltest Du dies mal mit allen enthaltenen Statements versuchen.
Das Skript an sich ist auch nicht so gross, ich koennte das auch mal hier ins Forum stellen.
Wenn der relevante Part nicht viel länger als ca. 20 Zeilen ist, ist das nicht gerade die schlechteste Idee. Dein DB-Layout der betroffenen Tabelle(n) gehört dann natürlich auch dazu.
Cheatah
Also etwa
UPDATE tabelle SET spalte = REPLACE(spalte, 'a', 'b')
Das geht ganz gut, nur habe ich jetzt dieses Problem: eine Spalte der Tabelle ist ein MEMO-Feld und da greift das UPDATE nicht.
Ich habe noch UPDATETEXT gefunden, aber da seh ich nicht richtig durch. Weisst du da Bescheid? Irgendwie muss ich einen Pointer auf die zu ersetzende Zeichenkette setzen. Ab wann weiss ich denn, das ich das ganze Feld durchsucht habe? Der Pointer setzt doch sicher immer nur auf das erste Auffinden der zu ersetzenden Zeichenkette, oder?
Die konkrete Aufagbe: in allen Zeitungsartikeln in der Datenbank muessen die HTML-kodierten Umlaute in deutsche Umlaute gewandelt werden.
Danke Andreas
Hi,
eine Spalte der Tabelle ist ein MEMO-Feld und da greift das UPDATE nicht.
was für eine Art Datentyp ist "MEMO"? Ein LOB?
Ich habe noch UPDATETEXT gefunden,
Sagt mir nichts; ist wohl MSSQL-spezifisch.
Die konkrete Aufagbe: in allen Zeitungsartikeln in der Datenbank muessen die HTML-kodierten Umlaute in deutsche Umlaute gewandelt werden.
Ei, das können 'ne Menge verschiedener sein.
Was hälst Du davon, die korrigierten Einträge in eine temporäre Tabelle mittels INSERT INTO zu schreiben und dann später entweder einfach zu wechseln oder mit einem UPDATE-Statement alles zurückzuschichten?
Cheatah