Setelah banyak pengujian, saya akhirnya menemukan bahwa masalahnya bukan pada kerangka kerja Entitas atau NpgSql sama sekali, tetapi penundaan yang saya lihat disebabkan oleh cache tulis. Saya selalu menulis file 30MB sebelum memasukkan baris ke tabel 1 dan saya yakin bahwa penulisan file selesai setelah File.WriteAllBytes kembali sehingga tidak akan memengaruhi pernyataan waktu di masa mendatang. Namun pada lapisan OS itu tidak benar-benar selesai menulis ke disk pada saat pernyataan penyisipan dijalankan menyebabkan pernyataan penyisipan ditunda secara artifisial.
Saya membuktikan ini dengan kode berikut:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
stopwatch 1 menunjukkan bahwa File.WriteAllBytes selalu membutuhkan waktu sekitar 500 md, lalu stopwatch 2 berdurasi sekitar 20 hingga 30 detik.
Jika saya mengubah MethodThatInsertsIntoTable1 untuk disisipkan ke tabel yang berbeda maka masih membutuhkan waktu 20 hingga 30 detik terlepas dari tabelnya.
Jika saya meningkatkan Thread.Sleep(1000) menjadi Thread.Sleep(30000) maka stopwatch 2 mencatat bahwa penyisipan membutuhkan waktu kurang dari 10 milidetik.
Ini menunjukkan bahwa bahkan setelah File.WriteAllBytes mengembalikan kontrol ke program, itu tidak benar-benar selesai menulis file ke disk.
Lingkungan tempat saya menjalankan adalah linux pada raspberry pi. Tes kecepatan tulis mengonfirmasi bahwa kecepatan tulis saya ke kartu sd hanya lebih dari 1MB/s yang akan selaras dengan hasil yang saya lihat, 20-30 detik untuk menulis file 30MB, itu tidak mungkin dilakukan dalam 500ms stopwatch 1 mengatakan itu.
Pengguna lain tampaknya mengalami masalah karena ini di File.WriteAllBytes tidak tidak memblokir
Setelah menambahkan HDD USB SSD eksternal ke raspberry pi dan mengubah untuk menyimpan file di sana, menyimpan file hanya membutuhkan 0,5 detik dan masalahnya hilang.