delete von Sätzen [ERLEDIGT]

Alles zum SQL-Dialekt

Moderator: Moderatoren

Antworten
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

delete von Sätzen [ERLEDIGT]

Beitrag 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 ?
Zuletzt geändert von Koverhage am So, 15. Mär 2015 10:05, insgesamt 2-mal geändert.
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag von Koverhage »

Sqlite
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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 > '');
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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.
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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 ?
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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.
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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.
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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:
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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.
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: delete von Sätzen [ERLEDIGT]

Beitrag 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.
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen [ERLEDIGT]

Beitrag 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 ;-)
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15689
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: delete von Sätzen

Beitrag 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
Gruß
Hubert
Antworten