Am 05.03.2020 08:51, schrieb Markus Bergholz:
Hallo Markus
oh, das hört sich aber für eine db sehr inperformant an!
Das habe ich auch gedacht... Allerdings ist es nicht immer so...
Heute früh habe ich wieder probiert: 1938981 Zeilen in 21 Sekunden...
Trotzdem konnten weitere SQL-Anfragen (INSERT) nicht sofort durchgeführt
werden.
Zur Klärung:
1) die SQL-Anfragen, die nicht sofort durchgeführt werden können, sind
INSERT in eine Tabelle (value_current), die vom Stored Procedure auch
bearbeitet wird
2) die Stored Procedure _LIEST_ einige Daten aus der Tabelle
value_current und speichert sie in eine andere Tabelle
(value_aggregat1), dann _LIEST_ die restliche Daten aus value_current
und speichert sie in eine temporäre Tabelle (value_current_1), die
später per RENAME in value_current geändert wird (die frühere
value_current wird in value_current_old umbenannt). Schließlich wird die
value_current_old per DROP vernichtet.
wenn das stored procedure 30k zeilen aktualisiert, ist das gesamte
remote i/o geblockt.
Ich könnte es mir vorstellen, dass eine kurze Sperrung während der
RENAME stattfindet, das ist aber nicht der Fall... Die Sperrung findet
tatsächlich während der Lesung aus value_current und Speicherung in
value_aggregat1 bzw. value_current_1.
Das ist für mich unerklärlich...
Und dass auch die Anfragen an _ANDEREN_ Datenbanken deswegen warten
müssen kann ich mir auch nicht erklären...
wie viel ram hat die kiste? innodb_pool_buffer_size? passt die db in
den ram?
Der Server hat 24GB RAM.
Die Einstellungen sind:
innodb_buffer_pool_size = 16G
innodb_buffer_pool_instances = 4
innodb_log_file_size = 1G
innodb_log_buffer_size = 16M
innodb_file_per_table = 1
innodb_io_capacity = 2000
innodb_read_io_threads = 128
innodb_thread_concurrency = 0
innodb_write_io_threads = 128
innodb_use_native_aio = 0
Vorher war innodb_buffer_pool_size war nur 8GB. Nach der Verdoppelung
dauert die Stored Procedure deutlich weniger, aber die Zugriffe werden
weiterhin gesperrt...
Ideen?
Danke
Luca Bertoncello
(lucab...@lucabert.de)