Seite 1 von 2
SQL Lite Datenbank so langsam?
Verfasst: 07.11.2016 20:06
von michstro
Hallo zusammen,
folgendes Listing läuft bei mir nur extrem langsam, ich denke so ca 30 Sekunden.
Code: Alles auswählen
;
; ------------------------------------------------------------
;
; PureBasic - Database example file
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
UseSQLiteDatabase()
Procedure CheckDatabaseUpdate(Database, Query$)
Result = DatabaseUpdate(Database, Query$)
If Result = 0
Debug DatabaseError()
EndIf
ProcedureReturn Result
EndProcedure
DatabaseFile$ = GetTemporaryDirectory()+"Database.sqlite"
Debug DatabaseFile$
If CreateFile(0, DatabaseFile$)
CloseFile(0)
If OpenDatabase(0, DatabaseFile$, "", "")
CheckDatabaseUpdate(0, "CREATE TABLE food (name CHAR(50), weight INT)")
For i= 1 To 450
CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
Next
If DatabaseQuery(0, "SELECT * FROM food WHERE weight > 7")
While NextDatabaseRow(0)
Debug GetDatabaseString(0, 0)
Wend
FinishDatabaseQuery(0)
EndIf
CloseDatabase(0)
Else
Debug "Can't open database !"
EndIf
Else
Debug "Can't create the database file !"
EndIf
Der Hintergrund ist der ich habe bisher die Daten einfach in eine CSV Datei geschrieben und das ging praktisch ohne das was zu merken war. Ich hatte jetzt nur das Problem wenn von mehreren Rechnern was verändert wurde das ich mit der Aktualität der Daten Probleme hatte, also es wurden änderungen überschrieben usw.
Habe ich irgendwo einen Gedankenfehler, was geht schneller?
Danke im Vorraus
Mikk
Re: SQL Lite Datenbank so langsam?
Verfasst: 07.11.2016 20:37
von STARGÅTE
Kann hier keine Probleme feststellen.
Die Erstellung dauert ca. 2s und die Abfrage ist praktisch sofort da.
Blockiert vllt ein anderes Programm die Datei?
Ist wirklich die While NextDatabaseRow(0) langsam oder nur das DatabaseUpdate() ?
Re: SQL Lite Datenbank so langsam?
Verfasst: 07.11.2016 20:50
von Sicro
Code: Alles auswählen
CheckDatabaseUpdate(0, "BEGIN")
For i= 1 To 100000
CheckDatabaseUpdate(0, "INSERT INTO food (name, weight) VALUES ('apple', '10')")
Next
CheckDatabaseUpdate(0, "COMMIT")
Dauert bei mir ca. EINE Sekunde MIT Debugger.
Weitere Informationen:
https://www.sqlite.org/lang_transaction.html
Re: SQL Lite Datenbank so langsam?
Verfasst: 08.11.2016 15:42
von michstro
Hallo zusammen,
super das mit dem
Code: Alles auswählen
CheckDatabaseUpdate(0, "BEGIN")
CheckDatabaseUpdate(0, "COMMIT")
macht echt den unterschied. Kommentiere ich die aus dauert es Stunden.
Mein Englisch ist nun nicht ganz so gut, habe ich aber richtig verstanden das während der Zeit keine Abfragen möglich sind?
Wenn ich jetzt z.bsp. überprüfen möchte ob ein Eintrag existiert und in diesem Falle nur einen Lagerort überschreiben, wäre das möglich?
Vielen Dank
Mikk
Re: SQL Lite Datenbank so langsam?
Verfasst: 08.11.2016 18:17
von DarkDragon
michstro hat geschrieben:Wenn ich jetzt z.bsp. überprüfen möchte ob ein Eintrag existiert und in diesem Falle nur einen Lagerort überschreiben, wäre das möglich?
Du meinst sowas wie
INSERT OR REPLACE INTO?
Re: SQL Lite Datenbank so langsam?
Verfasst: 08.11.2016 19:27
von michstro
Hallo,
genauso was meine ich, also sowas was wie
Code: Alles auswählen
UPDATE table_name
SET column1 = value1, column2 = value2...., columnN = valueN
WHERE [condition];
aber um das ganze abzukürzen, gibts irgendwo ne vernünftige Doku in Deutsch, oder muss ich zuerst Englisch lernen?
viele Grüsse
Mikk
Re: SQL Lite Datenbank so langsam?
Verfasst: 08.11.2016 19:49
von DarkDragon
michstro hat geschrieben:aber um das ganze abzukürzen, gibts irgendwo ne vernünftige Doku in Deutsch, oder muss ich zuerst Englisch lernen?
Hmm ja Englisch wär schon von Vorteil und Japanisch wird das neue Englisch, also vielleicht gleich mitlernen. Also im Prinzip muss man das INSERT einfach nur durch INSERT OR REPLACE ersetzen, dann wird, falls der Eintrag mit dem key schon existiert durch den neuen ersetzt. Wenn du komplexere Sachen machen willst musst du sowieso tiefer in SQLite rein oder die Objekte im voraus Blockweise untersuchen.
Re: SQL Lite Datenbank so langsam?
Verfasst: 08.11.2016 21:10
von michstro
Hallo,
danke für die schnelle Antwort, hört sich gut an mit dem INSERT OR REPLACE muß mir nur schon überlegen ob ich das so auch gebrauchen kann.
ersetzt dann dieser befehl alle Spalten oder nur die in Value genannten?
Hintergrund ich will eine bestehende .csv Datei in eine sqlite Datenbank überspielen und erweitern. Es gibt eine Sachnummer die eindeutig ist. Es sollen aber nur der Lagerort übernommen werden und evtuell änderungen am Material oder an der Bezeichnung nicht übernommen werden, weil meine neue Daten stärker ist.
Wäre schon schon wenn ich das mit dem Query erledigen könnte, werde ich morgen oder am WE dierekt mal ausprobieren
euch auf jeden Fall vielen Dank,
Mikk
Re: SQL Lite Datenbank so langsam?
Verfasst: 09.11.2016 08:03
von DarkDragon
michstro hat geschrieben:Hallo,
danke für die schnelle Antwort, hört sich gut an mit dem INSERT OR REPLACE muß mir nur schon überlegen ob ich das so auch gebrauchen kann.
ersetzt dann dieser befehl alle Spalten oder nur die in Value genannten?
Alle Attribute.
michstro hat geschrieben:Hintergrund ich will eine bestehende .csv Datei in eine sqlite Datenbank überspielen und erweitern. Es gibt eine Sachnummer die eindeutig ist. Es sollen aber nur der Lagerort übernommen werden und evtuell änderungen am Material oder an der Bezeichnung nicht übernommen werden, weil meine neue Daten stärker ist.
Dann kannst du theoretisch auch einfach die Keys im CSV zusammenwerfen, mit einem query die entsprechenden Zeilen aus der Datenbank holen (mit einem oder wenigen queries).
Re: SQL Lite Datenbank so langsam?
Verfasst: 09.11.2016 08:05
von DarkDragon
michstro hat geschrieben:Mein Englisch ist nun nicht ganz so gut, habe ich aber richtig verstanden das während der Zeit keine Abfragen möglich sind?
Doch es müssten Abfragen möglich sein, je nach Isolation der Datenbank. Es kommt drauf an wie SQLite da arbeitet, ob read uncomitted möglich ist oder nicht oder ob nur read committed gemacht wird etc...