SQLitewrapped & BCB6



  • http://www.sqlite.org/lang_update.html

    Frage total doof gewählt. SQLite unterstützt es nicht, frage sollte lauten warum nicht. Ist SQLite dahingehend optimiert oder sucht er einfach stur die komplette Datenbank dann ab, obwohl es nur einen einzigen Wert zum löschen gab?!

    Verschenkt man ziemlich viel Performance.



  • Ich weiß nicht was dieses LIMIT 1 bei DML soll. Entweder ich will alle Zeilen löschen, die dieses Kriterium entsprechen oder ich habe das Kriterium falsch gewählt. Was soll das "Lösche alle Kunden, die in Berlin wohnen, aber halt hör auf, wenn du einen beliebigen Berliner gefunden und gelöscht hast"? Die einzelnen Zeilen liegen in einer Tabelle nicht sortiert vor, wenn Du den Zugriff beschleunigen willst, dann prüfe, ob ein Index hilft.
    Wieso wird Geschwindigkeit von allen Anwendungsentwicklern immer so als extrem wichtig empfunden? Mehrbenutzersynchronisation und Transaktionsfähigkeit sind viel wichtigere Dinge. Wenn das System zu langsam ist, dann suche kein schnelleres sondern schau, wo in Deiner Anfrage der Fehler liegt.



  • Ich lösche immer über einen Primärschlüssel, wenn ich 1 Eintrag entfernen möchte. Trotzdem erhalte ich über das zusätzliche LIMIT 1 eine wesentlich kleinere Bearbeitungszeit in MySQL. Zumindest habe ich das vor 2-3Jahren festgestellt. Vielleicht hat sich dahingehend ja was getan in MySQL. Gleiches galt auch für ein Update über Primärschlüssel. Darum frag ich ja, ob SQLite dahingehend optimiert ist und merkt das Bedingung nur einen Primärschlüssel killen will und nicht ganze Datenbank auf die Bedingung prüft.



  • Normalerweise haben Datenbanksysteme ein Explain-Statement bei denen die optimierte interne Anfrage und deren geschätzten Kosten ausgegeben wird. In Postgres sieht das beispielsweise so aus:

    explain SELECT * FROM vwrptwa
    Sort (cost=923.90..924.31 rows=165 width=172)
    Sort Key: tblmtstamm.idmtstamm
    -> Hash Left Join (cost=141.31..917.82 rows=165 width=172)
    Hash Cond: (tblwarenausgang.wakeymt = tblmtstamm.idmtstamm)
    -> Hash Left Join (cost=111.13..885.37 rows=165 width=115)
    Hash Cond: (tblwarenausgang.wakeylo = tbllagerort.idlagerort)
    -> Nested Loop Left Join (cost=105.50..878.02 rows=165 width=99)
    -> Merge Left Join (cost=105.50..111.58 rows=165 width=83)
    ...

    Daran kann man erkennen, ob beispielsweise ein Table oder ein Index Scan erfolgt. SQLite besitzt wohl ein solches Explain-Statement, es soll lt. Doku aber anders verwendet werden. Da würde ich jetzt als erstes nachschauen.


Anmelden zum Antworten