Announcement

Collapse
No announcement yet.

Bitte um SQL-Hilfe und beste Performance

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

  • Bitte um SQL-Hilfe und beste Performance

    Hallo zusammen.

    Ich bitte Euch um Hilfe bzgl. der Performance...

    Fallbeispiel:

    Tabelle tab1 hat Spalte t1s1, t1s2, t1s3 usw...
    Tabelle tab2 hat Spalte t2s1, t2s2, t2s3 usw...

    Ich möchte nun, dass der Wert in t1s2 auf 0 geändert wird, wenn t1s1 nicht in t2s1 vorkommt und t1s2=1 und t1s3=1 ist.

    Zur Info am Rande...
    Die "echte Tabellen 1" hat rund 110000 Datensätze und ist rund 55MB groß.
    Die "echte Tabellen 2" hat rund 80000 Datensätze und ist rund 16MB groß.

    Ich hab z.B. folgende Lösung, aber das dauert viel zu lange:

    UPDATE tab1 SET t1s2=0 WHERE t1s2=1 AND t1s3=1 AND t1s1 NOT IN (SELECT t2s1 FROM tab2)

    Habt Ihr eine Idee / einen Vorschlag wie es schneller geht?

    Vielen Dank vorerst.
    Zuletzt editiert von ACX; 19.10.2010, 13:14.

  • #2
    Hallo,
    Originally posted by ACX View Post
    ...Habt Ihr eine Idee / einen Vorschlag wie es schneller geht?
    Pauschale Performance-Tipps zu geben ist immer schwer, da sie von zuvielen Faktoren abhängen.
    Hier würde ich jedoch auf jeden Fall mal ein WHERE ... NOT EXISTS ... statt dem WHERE ... NOT IN ... ausprobieren.

    Warum das gerade bei der Verwendung von NOT von Vorteil und was der große Unterschied ist, kann man in meinem Blog unter Was ist der Unterschied zwischen IN und EXISTS? nachlesen.

    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


    • #3
      Zusätzlich würde ich mal auf die Felder t1s1, t1s2, t1s3 und t2s1 jeweils einen Index darüberlegen. Weil aber t1s2 geändert wird, könnte es performanter sein, zuerst alle betroffenen Datensätze zu ermitteln, dann den Index über t1s2 zu deaktivieren(oder löschen) und nach dem Update diesen wieder zu aktivieren(bzw. neu erstellen) - aber das muss man alles ausprobieren.

      bye,
      Helmut

      Comment


      • #4
        Hi und Danke vorerst.

        Hab schon NOT EXISTS und NOT IN probiert... es dauert beides etwa gleich lang.

        Ich bin kein SQL-Freak und hoffe darauf, dass da jemand vielleicht eine gute und von mir aus auch etwas kompliziertere Idee hat

        Für die hierfür wichtigen Felder hab ich Indizes vergeben - das sollte ja eigentlich zur Performance-Erhöhung beitragen!?

        Testen tu ich das ganze über phpMyAdmin - da wird mir dann die Zeit angezeigt, die nötig war für die Verarbeitung.

        Bereits bei der Begrenzung der Abfrage mit ...LIMIT 10 begrenze, erhalte ich in phpMyAdmin schon ein "Gateway Time Out" bzw. dauert das schon etwa eine halbe Minute bzw. weit mehr!!
        Wenn ich ohne Limit laufen lasse bekomme ich 100%ig Probleme mit der PHP-Script-Laufzeit (df.eu) Probleme.

        Auf jeden Fall scheint da was nicht zu stimmen, denn wenn ich drei einzelne, einfache SQL-Querys in PHP mache und das Script laufen lasse, ist es deutlich schneller als der reine mySQL-Syntax.
        Ich ging eigentlich eher davon aus, dass es deutlich schneller werden würde, wenn alles in MySQL gemacht wird - oder eben richtig gemacht würde.

        Comment

        Working...
        X