SQL Lite Datenbank so langsam?

Anfängerfragen zum Programmieren mit PureBasic.
michstro
Beiträge: 16
Registriert: 06.02.2011 16:42

SQL Lite Datenbank so langsam?

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: SQL Lite Datenbank so langsam?

Beitrag 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() ?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: SQL Lite Datenbank so langsam?

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
michstro
Beiträge: 16
Registriert: 06.02.2011 16:42

Re: SQL Lite Datenbank so langsam?

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: SQL Lite Datenbank so langsam?

Beitrag 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?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
michstro
Beiträge: 16
Registriert: 06.02.2011 16:42

Re: SQL Lite Datenbank so langsam?

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: SQL Lite Datenbank so langsam?

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
michstro
Beiträge: 16
Registriert: 06.02.2011 16:42

Re: SQL Lite Datenbank so langsam?

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: SQL Lite Datenbank so langsam?

Beitrag 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).
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: SQL Lite Datenbank so langsam?

Beitrag 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...
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten