Odpowiadając osobiście na pytanie 1:Wygląda na to, że problem miał więcej wspólnego z Postgresql (a raczej bazami danych w ogóle). Biorąc pod uwagę punkty przedstawione w tym artykule:https://use-the- index-luke.com/sql/dml/insert Znalazłem następujące:
1) Usunięcie wszystkich indeksów z tabeli docelowej spowodowało uruchomienie zapytania w ciągu 9 sekund. Odbudowa indeksów (w postgresql) zajęła kolejne 12 sekund, więc w innych czasach wciąż znacznie mniej.
2) Mając na miejscu tylko klucz podstawowy, wstawianie wierszy uporządkowanych według kolumn klucza podstawowego skróciło czas do około jednej trzeciej. Ma to sens, ponieważ wymagane jest niewielkie lub żadne tasowanie wierszy indeksu. Sprawdziłem również, że to jest powód, dla którego moje złącze kartezjańskie w postgresql było przede wszystkim szybsze (tzn. wiersze zostały uporządkowane według indeksu, czysto przypadkowo), umieszczając te same wiersze w tabeli tymczasowej (nieuporządkowane) i wstawiając z tego faktycznie trwało to dłużej.
3) Próbowałem podobnych eksperymentów na naszych systemach mysql i odkryłem taki sam wzrost szybkości wstawiania podczas usuwania indeksów. Z mysql jednak wydawało się, że odbudowa zużytych indeksów zyskała na czasie.
Mam nadzieję, że pomoże to każdemu, kto natrafi na to pytanie podczas wyszukiwania.
Nadal zastanawiam się, czy możliwe jest usunięcie kroku zapisu do csv w pythonie (Q2 powyżej), ponieważ wierzę, że mógłbym wtedy napisać coś w pytonie, co byłoby szybsze niż czysty postgresql.
Dzięki, Giles