Announcement

Collapse
No announcement yet.

mySQL UPDATE table SET spalte4="" dauert ewig

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • mySQL UPDATE table SET spalte4="" dauert ewig

    Hallo,

    ich habe eine mysql-Tabelle, die mehrere Indizes und Indexspalten besitzt. Nun möchte in der Tabelle einen Spalteninhalt komplett leeren, dass mache ich mit folgenden Befehl:

    UPDATE table SET spalte4="";

    Es ist zwar eine sehr große Tabelle nur dauert diese Abfrage extrem lange (ich hab nach 1 1/2 Tagen abgebrochen), wohingegen andere spalten innerhalb einer halben Stunde abgearbeitet wurden.

    Jetzt ist mir aufgefallen das spalte4 in den Indizes als Indexspalte eingetragen ist. kann das ein Grund dafür sein, warum die UPDATE SET Abfrage hier solange dauert.

    Ich habe es jetzt schon ein paar mal an anderen mySQL Servern probiert und da dauert es überall genauso lange, außerdem kommt es manchmal zu folgenden Fehler:

    'Lock wait timeout exceeded; try restarting transaction'

    Habt ihr irgendwelche Tipps wie ich schnell die Spalten in dieser Tabelle (es sind noch mehrere betroffen) leeren kann? Ohne für jede einzelne Spalte Tagelang zu warten...

    Ich freue mich auf sämtliche antworten

    Viele Grüße
    David

  • #2
    Hallo,

    Originally posted by dave_christoph View Post
    Jetzt ist mir aufgefallen das spalte4 in den Indizes als Indexspalte eingetragen ist. kann das ein Grund dafür sein, warum die UPDATE SET Abfrage hier solange dauert.
    Du könntest ja mal ausprobieren, was passiert, wenn du den Index für den Löschvorgang entfernt.
    Ist es überhaupt noch sinnvoll eine Spalte zu indizieren, wenn man alle Werte aus der Spalte löscht?
    "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

    Viele Grüße Novi

    Comment


    • #3
      Danke dir für die Antwort, habe ich jedoch schon versucht.

      Wenn ich versuche die Indizies oder die Indexspalten zu löschen, stoße ich auf folgenden Fehler: 'Lock wait timeout exceeded; try restarting transaction'

      Ich habe die Windows-Version von MySQL und steuere die Befehle über den MySQL-Browser/ Admininistrator an.

      Wie ist denn die SQL-Syntax zum entfernen eines Indexes auf einer Spalte?

      Comment


      • #4
        Originally posted by dave_christoph View Post
        Wenn ich versuche die Indizies oder die Indexspalten zu löschen, stoße ich auf folgenden Fehler: 'Lock wait timeout exceeded; try restarting transaction'
        Wahrscheinlich kann er die Spalte nicht aktualisieren, da gerade auf einige Zeilen zugegriffen wird.

        Originally posted by dave_christoph View Post
        Wie ist denn die SQL-Syntax zum entfernen eines Indexes auf einer Spalte?
        Du wirst wahrscheinlich schon eine richte Syntax verwenden. Ansonsten würdest du eine andere Fehlermeldung erhalten
        [highlight=sql]
        ALTER TABLE `test` DROP INDEX `spalte4`
        [/highlight]

        Ich weiß nicht, ob es dir weiterhilft, aber vielleicht kannst du den Timeout Wert höher setzen: http://dev.mysql.com/doc/refman/5.0/...k_wait_timeout
        "(...) deshalb mag ich Binärtechnik. Da gibt es nur drei Zustände: High, Low und Kaputt." (Wau Holland)

        Viele Grüße Novi

        Comment


        • #5
          Hallo,

          muss ich um den timeout zu ändern diesen in der my.ini hochsetzen oder geht das über ein MYSQl-Befehl?

          Ich hoffe das liegt überhaupt an der indexierung....

          Gibt es eigentlicht eine Möglichkeit aus einer backup.sql (ertsellt von mysqldump) nur die tabellen ohne die Indices zu importieren?

          Viele Grüße
          David
          Zuletzt editiert von dave_christoph; 25.11.2009, 00:31.

          Comment


          • #6
            Wenn Du alle Werte auf " " setzen willst, wieso löscht Du nicht einfach die Spalte und fügst sie später wieder hinzu?

            alter table drop column

            Comment


            • #7
              Meinst du das würde schneller gehen? Muss ich morgen mal ausprobieren! Wie sieht es bei der Löschung mit den Indices aus?

              Comment


              • #8
                1. Der Index wird dann vom Server entfernt .

                2. Ich denke, das würde schneller gehen, weil keine Zeilenoperationen nötig sind.

                Comment


                • #9
                  Du kannst das Update auch fragmentieren und immer nur die nächsten tausend erneuern lassen, weil der Server dann nicht die gesamte Abfrage analysieren muß.

                  Allgemein habe ich die Erfahrung gemacht, daß bedingte Updates schneller funktionieren als unbedingte.

                  Versuch mal 'update table set spalte4="" where id<1000;'
                  oder ähnliches.

                  Comment


                  • #10
                    Hallo,
                    Originally posted by dave_christoph View Post
                    ...Jetzt ist mir aufgefallen das spalte4 in den Indizes als Indexspalte eingetragen ist. kann das ein Grund dafür sein, warum die UPDATE SET Abfrage hier solange dauert.
                    Wenn die betroffene Spalte eine Indexspalte ist, dann müssen natürlich auch die zugehörigen Indizes aktualisiert werden. Ggfs. könnte man hier die betroffenen Indizes vor dem Update löschen und anschließend ohne die Spalte wieder anlegen.
                    Sinnvoll wäre - um die Timeouts zu vermeiden - die Tabelle vorher mit LOCK TABLES komplett zu sperren. Dann haben zwar alle anderen beim Zugriff ein Problem, aber für deine Administration gehört sie dir.

                    Originally posted by dave_christoph View Post
                    ...Habt ihr irgendwelche Tipps wie ich schnell die Spalten in dieser Tabelle (es sind noch mehrere betroffen) leeren kann? Ohne für jede einzelne Spalte Tagelang zu warten...
                    Da es ja offensichtlich jedesmal um die gesamte Tabelle geht, wäre natürlich EIN Statement besser als für jede Spalte eines.
                    [highlight=sql]
                    update tabelle set
                    feld1 = '',
                    feld2 = '',
                    ...
                    [/highlight]

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment

                    Working...
                    X