Seite 1 von 1

delete von Sätzen [ERLEDIGT]

Verfasst: Fr, 13. Mär 2015 11:07
von Koverhage
Ich habe 2 Tabellen
Aufgaben
Einzelaufgabe

In der Aufgaben Tabelle stehen die Aufgaben

JobId,
JobBez
JobErledit am
z.B.
1
Auto waschen
13.03.2015

In der Einzelaufgabe Auto waschen
JobId 1
Unterjob 1
UnterBez Außenreinigung

JobId 1
Unterjob 2
UnterBez Innenreinigung

Ich möchte jetzt alle erledigten löschen, aber so wie ich da momentan mache

Code: Alles auswählen

for i = 1 to Xmax (xmas enthält die Anzahl der Sätze wo in JobErledigt am ein Datum steht)
    nJobId := aErledigte[i]
    delete from aufgaben where JobId = nJobId
    delte from einzelaufgabe where JobId = nJobId
next
Wenn jetzt viele erledigte vorhanden sind dauert das relativ lange.
Wie kann ich das in einem Aufwasch hinbekommen ?

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 12:35
von brandelh
um welchen SQL Server geht es denn und wie greifst du darauf zu ?

Je nach SERVER kann man das direkt auf dem Server einstellen, dass abhängige Daten beim Löschen des Stammsatzes gelöscht werden.

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 12:42
von Koverhage
Sqlite

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 13:06
von Koverhage
Denke das es so gehen müsste, komme aber gerade nicht zum testen

Code: Alles auswählen

DELETE FROM EINZELAUFGABEN
WHERE EXISTS
  ( SELECT *
    FROM AUFGABEN
    WHERE AUFGABEN.JobId = EINZELAUFGABEN.JobId  AND AUFGABEN.JobErledigtam > '');

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 13:33
von brandelh
Normalerweise ist bei SQLite je Befehl eine Transaktion fällig.
Für solche Aktionen kann man aber VORHER einmalig eine Transaktion öffnen, Befehle ausführen, und danach Beenden, bei B4A hat das den Ablauf stark beschleunigt.

Und warum SELECT * , gerade bei der Abfrage der zu löschenden Datensätze sollte doch der Fremdschlüssel reichen ;-)

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 14:10
von Koverhage
Und warum SELECT * , gerade bei der Abfrage der zu löschenden Datensätze sollte doch der Fremdschlüssel reichen ;-)
So habe ich das aus dem SQLITE Tutorial Beispiel, genau diesen Ablauf wollte ich ja nach meinem Eingangsposting beschleunigen

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 14:30
von brandelh
nochmal die Frage, soll das unter Xbase++ oder B4A laufen ?
Auf dem Desktop, welche Toolbox ?

Gerade die Smartphones sind sehr lahm, B4A habe ich aber HB_SQL Beispiele von Massenverarbeitung, wobei du das ja in einem Befehl verbunden hast, das ist also eine Transaktion.

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 14:35
von brandelh
Ich habe oben mal code Tags eingefügt ;-)
Was ich meinte ist, dass dies viel weniger Daten laden muss und daher eigentlich schneller sein sollte als mit * (ich hoffe die Syntax stimmt ...)

Code: Alles auswählen

DELETE FROM EINZELAUFGABEN
WHERE EXISTS
  ( SELECT JobId
    FROM AUFGABEN
    WHERE AUFGABEN.JobId = EINZELAUFGABEN.JobId  AND AUFGABEN.JobErledigtam > '');
wobei die Datensätze von Aufgaben sind dann ja immer noch da, wie wäre es erst die AUFGABEN zu löschen und dann in den EINZELAUFGABEN zu suchen, welche JobID NOT EXISTS ;-)

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 15:22
von Koverhage
Hubert,

erst die Aufgaben zu löschen geht nicht. In den Aufgaben steht das Erledigungsdatum,
ich könnte dann ja nicht mehr feststellen ob die Einzelaufgaben erledigt sind.
* Bedeutet doch nur das ich alle Felder haben möchte, JobId reicht meines Erachtens nicht aus,
da ich ja noch das Erledigungsdatum brauche.

Re: delete von Sätzen

Verfasst: Fr, 13. Mär 2015 17:24
von brandelh

Code: Alles auswählen

erst die Aufgaben zu löschen geht nicht. In den Aufgaben steht das Erledigungsdatum ...
Bitte besser lesen was ich schreibe (oder habe ich mich falsch ausgedrückt :oops: ) ;-)
Wenn du in AUFGABEN die erledigten Sätze löschst und danach in EINZELAUFGABEN mit
EINZELAUFGABEN.JobId existiert nicht in AUFGABEN.JobId suchst, dann sollte das gehen.

Code: Alles auswählen

ich könnte dann ja nicht mehr feststellen ob die Einzelaufgaben erledigt sind.
aber ob es keinen Satz mit der JobId gibt.
Wenn in den EINZELAUFGABEN ein Satz existiert, den es in AUFGABEN (verknüpft über die JobId) nicht gibt, dann muss man den löschen.

Code: Alles auswählen

* Bedeutet doch nur das ich alle Felder haben möchte, 
das habe ich schon verstanden, ja nach ANZAHL ist das aber nicht sinnvoll.

Code: Alles auswählen

JobId reicht meines Erachtens nicht aus, da ich ja noch das Erledigungsdatum brauche.
Dein Select liefert die Ergebnismenge doch nur an die LÖSCH-Abfrage und die LÖSCH-Abfrage löscht alles was zurückgegeben wird.
Diese prüft die beiden Werte NICHT MEHR !

Die Prüfung wird schon im Select abgearbeitet !
In der Rückgabe sind nur noch die, für die die Bedingung zutrifft, daher müsste der Fremdschlüssel (JobId) reichen.

ABER wenn es geht ist es ja NICHT FALSCH ;-)

Mit was greifst du darauf zu und um wieviele Sätze handelt es sich ?
Auf welcher Plattform ?

Re: delete von Sätzen

Verfasst: Sa, 14. Mär 2015 10:11
von Koverhage
Bitte besser lesen was ich schreibe (oder habe ich mich falsch ausgedrückt :oops: ) ;-)
Nein, aber falsch gelesen. ;)
Ich lösche in meinem Beispiel in der Aufgaben Tabelle nichts!!!
Dort steht DELETE FROM Einzelaufgaben alle die in der Aufgaben Tabelle vorhanden sind und ein Erledigungsdatum haben.
Wenn die Einzelaufgaben gelöscht sind, werden im Nachgang die Aufgaben gelöscht, die als erledigt gekennzeichnet sind.

So sollte es zumindest sein bzw. was ich mir gedacht habe. Deswegen mein Post an die SQL Spezialisten hier im Forum
ob das so funktioniert.

Re: delete von Sätzen

Verfasst: Sa, 14. Mär 2015 10:16
von Koverhage

Code: Alles auswählen

das habe ich schon verstanden, ja nach ANZAHL ist das aber nicht sinnvoll.
In dem Beeispiel habe ich nur 3 Felder, wovon ich 2 benötige. Für mich stellt sich die Frage
ob es Sinn macht oder die Ausführung nachher schneller ist, wenn ich d 2 Felder angebe anstatt dem * für alle 3.
Meiner Meinung nach macht das (für diese Beispiel) keinen Sinn.

Soviel kenne ich noch von SQL das wenn ich z.B. eine Tabelle mit mehr Feldern habe, die benötigten im Select Statement angebe.

Re: delete von Sätzen

Verfasst: Sa, 14. Mär 2015 10:23
von Koverhage
Mit was greifst du darauf zu und um wieviele Sätze handelt es sich ?
Auf welcher Plattform ?
Verstehe ich jetzt nicht so ganz. Plattform ist derzeit Android, wobei die
Aufgaben / Einzelaufgaben als CSV Datei unter Windows generiert werden
und im Android in die SQLite Datenbank importiert werden ;-)
Programmiert ist die App meines Wissens in B4A :lol:
In den Aufgaben sind es 81 Sätze, in den Einzelaufgaben 546

Re: delete von Sätzen

Verfasst: Sa, 14. Mär 2015 11:08
von brandelh
Koverhage hat geschrieben:In dem Beeispiel habe ich nur 3 Felder, wovon ich 2 benötige...
Soviel kenne ich noch von SQL das wenn ich z.B. eine Tabelle mit mehr Feldern habe, die benötigten im Select Statement angebe.
Nur 3 Felder in den Einzelaufgaben, dann spielt das keine Rolle, da gebe ich dir Recht ;-)

Re: delete von Sätzen

Verfasst: Sa, 14. Mär 2015 11:11
von brandelh
Koverhage hat geschrieben:In den Aufgaben sind es 81 Sätze, in den Einzelaufgaben 546
wenn das langsam geht, dann wegen der Hardware.

Re: delete von Sätzen

Verfasst: Sa, 14. Mär 2015 12:30
von Martin Altmann
Moin Hubert,
brandelh hat geschrieben:Nur 3 Felder in den Einzelaufgaben, dann spielt das keine Rolle, da gebe ich dir Recht ;-)
diese pauschale Aussage ist so latürnich Unsinn ;-)
Wenn die dritte Spalte z.B. ein Blob wäre, würde das sehr wohl einen Unterschied machen :lol:
Klaus: wenn das Smartphone nicht über WLAN an den Server geht und das Inklusivvolumen aufgebraucht ist, geht es natürlich auch sehr langsam - noch dazu, wenn man das nicht über Bulk-delete löschen lässt (so dass die Last auf dem Server ist), sondern jeden Satz einzeln vom Smartphone aus.

Viele Grüße,
Martin

Re: delete von Sätzen

Verfasst: Sa, 14. Mär 2015 21:22
von brandelh
Martin Altmann hat geschrieben: Klaus: wenn das Smartphone nicht über WLAN an den Server geht und das Inklusivvolumen aufgebraucht ist, geht es natürlich auch sehr langsam - noch dazu, wenn man das nicht über Bulk-delete löschen lässt (so dass die Last auf dem Server ist), sondern jeden Satz einzeln vom Smartphone aus.
da hast du wohl oben nicht gelesen um was es geht :roll: :lol: ... nach dem UNSINN musste das jetzt sein :D im Übrigen hat Klaus gesagt dass es nicht viele Daten sind ;-)

Er will mit B4A in der SQLite DB LOKAL Datensätze löschen.
Von meinem Samsung Galaxy S+ weiß ich, dass z.B. Einlesen von CSV Daten 100 Sätze pro Sekunde realistisch sind.
Es gibt schnellere, aber die internen SD Karten sind keine Festplatten und die Prozessoren sowie der Hauptspeicher sind mit PCs nicht vergleichbar.

Wenn man es in eine Anweisung bekommt, wird die Transaktionssperre nur einmalig aufgerufen, das bringt was, aber ob es wirklich schnell wird hängt auch vom Gerät ab.

Ob da die SQL Sprache viel ändern kann, wenn die Hardware hinkt ... :wink:

Re: delete von Sätzen

Verfasst: So, 15. Mär 2015 10:00
von Martin Altmann
brandelh hat geschrieben:da hast du wohl oben nicht gelesen um was es geht :roll: :lol: ... nach dem UNSINN musste das jetzt sein :D
Hubert,
und das macht Deine Pauschalaussage jetzt besser ? 8)

Viele Grüße,
Martin

Re: delete von Sätzen

Verfasst: So, 15. Mär 2015 10:04
von Koverhage
Es klappt so wie ich es mir gedacht habe. Ich habe jetzt
2 SQL Anweisungen die gegenüber der alten Version
von (2 x 81) SQL Anweisungen
Dürfte also mindestens einen geringen Geschwindigkeitsvorteil ergeben.

Re: delete von Sätzen [ERLEDIGT]

Verfasst: So, 15. Mär 2015 11:06
von Koverhage
Gefühlt ohne es gemessen zu haben.
Für die Aktion wird nach der Umstellung nur noch höchsten 10 Prozent der bisherigen Zeit
benötigt.
Solche kleinen Optimierungen können erhebliche Auswirkungen haben.

Re: delete von Sätzen [ERLEDIGT]

Verfasst: So, 15. Mär 2015 17:47
von brandelh
Ich sag doch, 2 Transaktionen gegen 81 ;-)
hätte man vor der Schleife die automatische Transaktion ab und danach wieder eingeschaltet, wäre es vermutlich ähnlich ;-)

Re: delete von Sätzen

Verfasst: So, 15. Mär 2015 17:48
von brandelh
Martin Altmann hat geschrieben:
brandelh hat geschrieben:da hast du wohl oben nicht gelesen um was es geht :roll: :lol: ... nach dem UNSINN musste das jetzt sein :D
Hubert,
und das macht Deine Pauschalaussage jetzt besser ? 8)
Viele Grüße,
Martin
Meine Aussage bezog sich auf die davor und sind nur in diesem Kontext richtig.

Dass du das nun zu einem "falschen Lehrsatz" erklärst ist der eigentliche Fehler [-X :D