Forum: PC-Programmierung Datenbankproblem zu lange Zugriffszeiten


von Klatec (Gast)


Lesenswert?

Hallo Zusammen

Ich habe ein Leitsystem mit einer M-CPU und max. 16 IO-Baugruppen 
entwickelt man spricht bei dieser Zusammenstellung von einer Komponente 
und ich werde für mein Vorhaben in etwa 20 Komponenten benötigen. Um 
diese Anlagen parametrieren zu können habe ich ein Tool in C# 
geschrieben und eine Access (2013) Datenbank für die Parameter 
verwendet. Aber leider  habe ich den Umfang der Datensätze unterschätzt 
und bei 20 Komponenten komme ich ca. auf 350000 
(dreihundertfünfzigtausend) Datensätzen in der Parameter-Tabelle und da 
gehen einige Funktionen sehr zäh. Bei zwei Komponenten in der Datenbank 
habe ich eine Funktion die ca. 15 Sekunden benötigt und mit 20 
Komponenten habe ich sie nach 7 Minuten abgebrochen will ich dachte das 
sich der PC aufgehängt hat.
Ich verwende reader = cmd.ExecuteReader(); und cmd.ExecuteNonQuery für 
die Bearbeitung der Datensätze.
Macht es Sinn auf eine andere Datenbank umzusteigen oder welche 
Möglichkeiten habe ich um die Laufzeit der Datenbankbearbeitung 
brauchbar zu gestallten?

Bitte um eure Hilfe. Danke.

Lg.
Johann K.

von Planlos (Gast)


Lesenswert?

Indexe für alle oft benötigten Queries hast du angelegt?

350k Einträge sollten für keine Datenbank ein Problem darstellen.

von c.m. (Gast)


Lesenswert?

indices auf felder in where-bedingungen. falls ms sowas unterstützt: 
b-tree auf felder mit hoher kardinalität, bitmap auf solche mit 
niedriger.

ohne indices hast du bei jeder abfrage full table scans.

wobei ich mssql nur als "schlechte datenbank", bzw. schlecht entwickelte 
frontends kennegelernt habe - ich komme eigentlich aus der oracle ecke 
mit ein wenig rumspielerei mit mysql/mariadb.

von Peter II (Gast)


Lesenswert?

Klatec schrieb:
> und eine Access (2013) Datenbank für die Parameter
> verwendet.

wenn ihr Access wirklich nur als DB nutzt, dann würde ich vorschlagen 
auf MS-SQL zu wechseln. Bis 2GB Datenbank ist es kostenlos, ist ein 
Datenbanksystem was sehr gut skaliert und nicht bloss ein Treiber wie 
bei Access, wo es nicht mal einen wirklichen Prozess gibt.

Wir haben dort weiter mehr als 500.000.0000 Einträge in einer Tabelle 
und es geht flott.

von (prx) A. K. (prx)


Lesenswert?

Es gibt zu sicherlich jeder Datenbank Texte über die Optimierung von 
Abfragen und die Gestaltung der DB hinsichtlich Indizes. 350k Einträge 
sind recht wenig, aber ohne Index, aber dafür umfangreicher Bestückung 
mit teuren Funktionen im WHERE. zwingt man eine DB trotzdem in die Knie.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

c.m. schrieb:
> wobei ich mssql nur als "schlechte datenbank", bzw. schlecht entwickelte
> frontends kennegelernt habe

Yep. Webentwickler und Datenbanken sind oft wie Hund und Katz. ;-)

von Dirk D. (dicky_d)


Lesenswert?

Klatec schrieb:
> [...] und eine Access (2013) Datenbank für die Parameter
> verwendet. [...]
> Macht es Sinn auf eine andere Datenbank umzusteigen?

Ja.
fast egal welche, nimm was dir am besten passt. Selbst sqlite wird 
besser performen.

von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> Es gibt zu sicherlich jeder Datenbank Texte über die Optimierung von
> Abfragen und die Gestaltung der DB hinsichtlich Indizes. 350k Einträge
> sind recht wenig, aber ohne Index, aber dafür umfangreicher Bestückung
> mit teuren Funktionen im WHERE zwingt man eine DB trotzdem in die Knie.

ja, das kann ACCESS auch. Aber das dumme an ist, das es keinen 
Serverprozess gibt. Der Treiber ist die Datenbank und öffnen die Datei 
direkt. Sobald ein paar mehr Leute die DB nutzen, muss die ganze 
Synchronisierung übers Dateisystem laufen. Auch muss jeder Treiber die 
Daten selber cachen weil es kein gemeinsamen ram gibt.

Ein Wechsel auf mssql sollte um unproblematischsten sein, weil beide 
doch ein paar Ähnlichkeiten haben. Bei MySQL und Postgresql könnte das 
etwas mehr aufwand sein.  Und da es eh C# ist, passt doch ein 
MS-Datenbank recht gut dazu. Dort kann man dann sogar sehr effiziente 
Bulk-Operationen nutzen.

von Peter II (Gast)


Lesenswert?

c.m. schrieb:
> wobei ich mssql nur als "schlechte datenbank", bzw. schlecht entwickelte
> frontends kennegelernt habe - ich komme eigentlich aus der oracle ecke
> mit ein wenig rumspielerei mit mysql/mariadb.

meinst du jetzt ACCESS oder MSSQL? MSSQL ist schon ein guten DB-System. 
Mich nervt Oracle da schon viel mehr, da geht alles irgendwie 
umständlich.

von Klatec (Gast)


Lesenswert?

Hallo Planlos

Ich tu mir etwas schwer dich mit Planlos anzusprechen wenn da wer 
planlos ist bin das sicher ich.
Nein ich habe keine Indexe angelegt ich habe schon davon gelesen aber 
bei den Datenbankanwendungen die ich bisher gemacht habe war die 
Zugriffszeit kein Thema und daher habe ich mich damit nicht beschäftigt. 
Wie du schon bemerkt haben wirst bin ich jetzt nicht der große 
Programmierer und danke dir für deinen Tipp. Ich werde versuchen diesen 
umzusetzen.

Schönen Abend.

Johann K.

von (prx) A. K. (prx)


Lesenswert?

Peter II schrieb:
> MSSQL ist schon ein guten DB-System.

MS SQL ist völlig ok, insbesondere innerhalb der Limitierungen der 
kostenlosen Version (Express?). Ist halt ein etwas grösserer Klops auf 
der Platte als MySQL und wenn man irgendwann doch die Limitierungen 
überschreiten sollte, dann wärs besser, wenn man sich über die 
Lizenzierung vorher Gedanken gemacht hat.

Zu beachten ist, dass bei der Grössenbeschränkung meiner Erinnerung nach 
die Transaction Logs mitgerechnet werden. Wenn man ausgiebig modifiziert 
und mit vollem Logging arbeitet spielt das schon eine Rolle.

> Mich nervt Oracle da schon viel mehr, da geht alles irgendwie
> umständlich.

Oracle wäre hier mit Kanonen auf Spatzen geschossen und würde 
voraussichtlich eher in einem Rohrkrepierer enden als den Spatz töten. 
Das ist ein System für Experten.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Größenbeschränkung ist bei neueren Express-Versionen nach oben 
angehoben worden; SQL Server Express 2014 bietet 10 GB pro Datenbank.


https://msdn.microsoft.com/library/cc645993.aspx

von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> MS SQL ist völlig ok, insbesondere innerhalb der Limitierungen der
> kostenlosen Version (Express?). Ist halt ein etwas grösserer Klops auf
> der Platte als MySQL und wenn man irgendwann doch die Limitierungen
> überschreiten sollte, dann wärs besser, wenn man sich über die
> Lizenzierung vorher Gedanken gemacht hat.

aktuell sind bis zu 10GB je Datenbank drin.

http://www.microsoft.com/en-gb/server-cloud/products/sql-server-editions/overview.aspx

Und wenn man will, legt man jede Tabelle in eine extra Datenbank. Was 
dann nur nicht geht sind contraints. Sonst ist das auch kein Problem 
Datenbankübergreifend abzufragen.

von Wolfgang (Gast)


Lesenswert?

Klatec schrieb:
> Nein ich habe keine Indexe angelegt ich habe schon davon gelesen

Nicht nur lesen, auch beherzigen.

Wenn du in einem Katalog einen bestimmten Artikel suchst, tust du dich 
ohne sortierte Liste der Warengruppen/Artikel auch fürchterlich schwer, 
einen bestimmten Artikel zu finden. Alternativ kann der Datenbestand 
natürlich auch passend sortiert sein. Das kommt auf die Daten und das 
dahinter stehende Datenmodell drauf an. Aber 350000 Datensätze wild 
durcheinander mit möglicherweise noch irgendwelchen aufwändigen 
Berechnungen in der Abfrage, zwingen fast jeder Performance in den 
Keller.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Man möge sich mal mit dem MySQL-Ableger "MariaDB" befassen. Insbesondere 
die Möglichkeit, notfalls für jede einzelne Tabelle eine eigene 
Storage-Engine (außer MyISAM oder InnoDB gibts nämlich noch reichlich 
andere, z.B. "Memory") zu definieren, verleiht gewissermaßen "Flügel" 
... !

von Peter II (Gast)


Lesenswert?

Frank E. schrieb:
> Man möge sich mal mit dem MySQL-Ableger "MariaDB" befassen. Insbesondere
> die Möglichkeit, notfalls für jede einzelne Tabelle eine eigene
> Storage-Engine (außer MyISAM oder InnoDB gibts nämlich noch reichlich
> andere, z.B. "Memory") zu definieren, verleiht gewissermaßen "Flügel"
> ... !

ob das für Ihn sinnvoll ist?
[...]
It is best-used for read-only caches of data from other tables, or for 
temporary work areas.
[...]

für die paar Daten kann er jeden DB nehmen, es müssen nur die Daten 
passend indiziert sein.

von Felix A. (madifaxle)


Lesenswert?

Mal so nebenbei: Access ist KEINE Datenbank

von Peter II (Gast)


Lesenswert?

Felix A. schrieb:
> Mal so nebenbei: Access ist KEINE Datenbank

wie kommst du darauf?

was ist an Access anders als z.b. an sqllite?

von Klatec (Gast)


Lesenswert?

Hallo Zusammen

Ich bin überwältigt welch intensive  Diskussion meine Frage vom Zaun 
gebrochen hat.
Ich muss zugeben das mich einige Antworten überfordert haben aber ich 
werde jetzt einmal Schritt für Schritt versuchen meine Tabellen zu 
indizieren und werde mir dazu aus dem www einige Beispiele an sehen. Ich 
bedanke mich für eure Hilfe.

Lg.

Johann K.

von Der Andere (Gast)


Lesenswert?

Peter II schrieb:
> Felix A. schrieb:
>> Mal so nebenbei: Access ist KEINE Datenbank
>
> wie kommst du darauf?

Doch Peter, auch Access ist eine Datenbank, schliesslich bezeichnen auch 
viele VSAM und ISAM als Datenbanken
:-)

von (prx) A. K. (prx)


Lesenswert?

Der Andere schrieb:
> Doch Peter, auch Access ist eine Datenbank, schliesslich bezeichnen auch
> viele VSAM und ISAM als Datenbanken

Die Microsoft Jet Engine, auf der Access aufbaut, kann man als RDBMS 
betrachten. Relationale Datenbanknutzung über SQL ist drin, 
Transaktionsverarbeitung und Zugriffsrechte ebenfalls.

Access ist aber kein Datenbank-Server wie MySQL, MS SQL oder Oracle und 
findet bei gleichzeitigem Zugiff durch mehrere Anwender sehr schnell 
seine Grenzen. Dafür ist es nicht konstruiert, ebensowenig wie das im 
Ansatz grob ähnliche SQLite.

https://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine

: Bearbeitet durch User
von Felix A. (madifaxle)


Lesenswert?

@Peter II

https://de.wikipedia.org/wiki/Liste_der_Datenbankmanagementsysteme

Access ist danach einfach kein Datenbankmanagementsystem. Wohingegen 
sqlite das jedoch ist.

Eine exakte Erklärung, weshalb das so ist, finde ich gerade nicht.

von (prx) A. K. (prx)


Lesenswert?

Felix A. schrieb:
> Eine exakte Erklärung, weshalb das so ist, finde ich gerade nicht.

Weil Access eine Anwendung ist und nur dessen Jet Engine ein RDBMS - und 
die Jet Engine steht drin in der Liste.

SQLite und Microsofts Jet Engine sind Programmbibliotheken, die es 
Programmen ermöglichen, wesentliche von klassischen RDBMS zur Verfügung 
gestellte Features in Programmen zu nutzen, ohne dafür einen separat 
arbeitenden Datenbankserver einrichten zu müssen. Zugriff durch mehrere 
gleichzeitig laufende Instanzen ist dank dieser Arbeitsweise allenfalls 
über sehr grobes Locking auf Fileebene möglich, wenn überhaupt.

Access wiederum setzt auf die Jet Engine eine Anwendung oben drauf. 
Insoweit ist Access genau genommen kein Datenbanksystem, sondern eine 
Anwendung mit integrierter Datenbank-Engine. Und steht deshalb nicht als 
"MS Access" drin, sondern als "Jet Engine".

Man kann Access auch als Frontend zu anderen RDBMS verwenden, also z.B. 
Oracle dahinter an Stelle der Jet Engine.

: Bearbeitet durch User
von Georg (Gast)


Lesenswert?

A. K. schrieb:
> bei gleichzeitigem Zugiff durch mehrere Anwender

Zwei davon sind definitiv zuviel für sicheren Betrieb.

Georg

von Peter II (Gast)


Lesenswert?

Georg schrieb:
> Zwei davon sind definitiv zuviel für sicheren Betrieb.

so schlimm ist es nun auch wieder nicht. es können schon mehre Leute in 
einer ACCESS db gleichzeitig arbeiten - nur schneller wird es dadurch 
nicht. Stabil ist es aber trotzdem.

von Carl D. (jcw2)


Lesenswert?

Aber Jet Engine ist File-basiert, jeder Prozess liest Seite aus dem 
DB-File und kann (sinnvoll) nur auf Ebene dieser DB-Seiten in der Datei 
sperren. Und all das geht üblicherweise übers Netzwerk.
Bei SQL-Server gibt es EINE Prozess, der die Files verwaltet/seitenweise 
cached und der kann Sperren auf Satzebene benutzen. Den Unterschied 
merkt man besonders bei parallelen Zugriffen. Es fließt auch nur das 
Ergebnis über's Netzwerk. Ich kann mich an ein Experiment in einem 
O'Reilly Buch erinnern, wo ein Webserver 10x soviele Anfragen in einem 
10-tel der Zeit bedient hat. Rein durch Umstieg Jet auf SQL-Server. 
Beide via JDBC.

von bluppdidupp (Gast)


Lesenswert?

Frank E. schrieb:
> Man möge sich mal mit dem MySQL-Ableger "MariaDB" befassen.

Bei MySQL/MariaDB sollte man aber aufpassen, das man direkt zu Beginn 
den strict-Mode aktiviert hat:
http://www.tocker.ca/2014/01/14/making-strict-sql_mode-the-default.html
...und die DB diverse Ferkeleien erst gar nicht zu lässt ;D

von marvol (Gast)


Lesenswert?

Ich habe mal vor langer Zeit mit Access als Datenspeicher gearbeitet, so 
richtig problematisch wurde es erst als die Datei über 100 MB groß 
wurde.

Aktuell verwende ich Sqlite auch mit 90.000 Datensätze und 10 
Datenfelder pro Datensatz, also 900.000 Daten. Dies läuft alles im 
Sekundenbereich, also absolut unproblematisch.

Wie ist denn ein Datensatz aufgebaut? Und wie sind denn die Abfragen 
aufgebaut, werden dort eventuell viele Verknüpfungen unter mehreren 
Tabellen gefordert?

Vielleicht kannst Du beispielhaft mal die Struktur der Datenbank 
darstellen, so dass man das ganze mal simulieren kann (nur in Sqlite, 
Access macht für mich keinen Sinn). Und dann auch mal formulieren, wie 
die Abfragen aussehen. Vielleicht ist es nur ein Problem der 
Datenbankstruktur.

Gruß
Marvol

von Klatec (Gast)


Lesenswert?

Hallo Marvol

Alle Abfragen beginnen mit in der Tabelle KOMP (Komponnenten Nr.)

Tab KOMP
RNr  KNr  StaNr  Bez  SetNr
10  254  255  Test  16
10  25  255  Test25  17

Hier ermittle ich die SetNr mit Hilfe der Regions- und Komponentennummer 
die ist für jede Komponente eindeutig und schreibe sie in eine Variable. 
Mit dieser SetNr werden dann in der Tabelle Value1 alle nötigen Abfragen 
durchgeführt.
Die Tabelle Value1 hat dann 52 Spalten und ca. 350000 Datensätze bei 20 
Komponenten.
Die meisten Datensätze haben die Ausgabebaugruppen knapp 2000.
In der Tabelle Value1 wird durch die Spalten SetNr und BGNr 
(Baugruppennummer) und je nach Parameter gibt es dann noch 2 bis drei 
Spalten nach denen gefiltert wird. Aber die Abfragen erfolgen immer nur 
über eine Tabelle.
Ich hoffe ich konnte es einiger maßen erklären.

Lg.

Johann K.

von Klatec (Gast)


Lesenswert?

Hallo Marvol

Habe vergessen die Datei hat 1,1 GB.

Lg.
Johann K

von guest (Gast)


Lesenswert?

A. K. schrieb:
> Weil Access eine Anwendung ist und nur dessen Jet Engine ein RDBMS - und
> die Jet Engine steht drin in der Liste.

Nicht nur die, man schaue mal unter 'M' nach:
"Microsoft Access – das relationale Datenbanksystem von Microsoft für 
PCs"

von Test87 (Gast)


Lesenswert?

Ist ja sehr lustig wie viele hier gleich mit der 
Wechsel-die-Datenbank-Keule um sich schlagen - mit absolut 0 
Informationen wie seine Datenbank aussieht und wie er darauf zugreift 
(nach eigenen Aussage ist er ja nicht so der Crack oder?)

Regel bei Datenbanken:

-Vermeide viele kleine iterative Selects/Abfragen um dein Ergebniss 
zusammen zu sammeln - das ist in jeder Datenbank absolut tödlich - SQL 
ist sehr mächtig

-arbeite mit Indices - aber nicht einfach wild einrichten - zu viel ist 
auch nicht gut

-nicht immer alles mit TEXT oder sonstige "Übertypen" für Zahlen usw. 
benutzen - kostet alles

zu deinen Tabellen/Queries

am besten schreibst du die mal sauber auf

Tabelle1
  TYP feld1
  TYP feld2
  usw.

und die Tabellenbezüge

und dazu GENAU die Abfragen/Ablauf die du tätigst/machst - es kommt auf 
die Details an - moeglicherweise einfach zu iterativ

du koenntest deine Beispiel auch einfach für SQL Fiddle vorbereiten dann 
kann man gleich damit spielen

http://sqlfiddle.com/#!9/dcb16/1

von Klatec (Gast)


Lesenswert?

Hallo Zusammen

Ich möchte mich bei allen sehr herzlich für eure Unterstützung bedanken. 
Die Lösung war die Indizierung und nun flutscht's, weit schneller als 
vorher mit nur einer Komponente. Ich bin begeistert. Danke.

Lg.

Johann K.

von Planlos (Gast)


Lesenswert?

Klatec schrieb:
> Ich bin begeistert. Danke.

Schön dass es so gut klappt.
Wenn deine Datenbank dann auf 350 Mio Einträge angewachsen ist, sprechen 
wir uns wieder :)

von Klatec (Gast)


Lesenswert?

Hallo Planlos

Das wird nicht passieren weil ich nicht viel mehr als 20 Komponenten 
benötige.

Lg.
Johann K.

von Test87 (Gast)


Lesenswert?

>Die Lösung war die Indizierung und nun
>flutscht's, weit schneller als
>vorher mit nur einer Komponente.

wenn du uns jetzt noch deine SQL-Abfrage(n) usw. zeigst lernst du dann 
vielleicht auch gleich was für die nächste, noch größere DB - wo dann 
z.B. nur ein Index hinzufügen auch nicht mehr reicht

von Peter II (Gast)


Lesenswert?

Test87 schrieb:
> wenn du uns jetzt noch deine SQL-Abfrage(n) usw. zeigst lernst du dann
> vielleicht auch gleich was für die nächste, noch größere DB - wo dann
> z.B. nur ein Index hinzufügen auch nicht mehr reicht

bei einer Tabelle und einer Abfrage - kann es nicht einen sinnvollen 
index gehen. Maximal kann man noch nach Typ unterscheiden( clustered, 
unique ... )

von Test87 (Gast)


Lesenswert?

von Klatec so geschrieben
>Hier ermittle ich die SetNr mit Hilfe der Regions- und Komponentennummer
>die ist für jede Komponente eindeutig und schreibe sie in eine Variable.
>Mit dieser SetNr werden dann in der Tabelle Value1 alle nötigen Abfragen
>durchgeführt.

schreibe sie in eine Variable...alle nötigen Abfragen
das könnten auch mehrere sein - eine einzige reicht - aber
es ist nicht klar ob es so ist

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.