След много тестове в крайна сметка открих, че проблемът изобщо не е в Entity framework или NpgSql, а забавянето, което виждах, беше причинено от кеширане на запис. Винаги записвах 30MB файл, преди да вмъкна ред в таблица 1 и вярвах, че записът на файла е направен след връщане на File.WriteAllBytes, така че да не повлияе на бъдещи изявления за времето. Въпреки това на слоя на операционната система записът на диска не е бил реално завършен до момента, в който операторът за вмъкване е бил изпълнен, което е причинило изкуственото забавяне на оператора за вмъкване.
Доказах това със следния код:
Stopwatch sw1 = new Stopwatch();
sw1.Start();
File.WriteAllBytes(myBytes);
sw1.Stop();
Thread.Sleep(1000);
Stopwatch sw2 = new Stopwatch();
sw2.Start();
MethodThatInsertsIntoTable1();
sw2.Stop();
хронометър 1 показа, че File.WriteAllBytes винаги отнема около 500 ms, след това хронометър 2 отчиташе около 20 до 30 секунди.
Ако променя MethodThatInsertsIntoTable1 за вмъкване в различна таблица, това продължава да отнема 20 до 30 секунди, независимо от таблицата.
Ако увелича Thread.Sleep(1000) до Thread.Sleep(30000), тогава хронометърът 2 записва, че вмъкването отнема по-малко от 10 милисекунди.
Това показва, че дори след като File.WriteAllBytes върне контрола на програмата, записът на файла на диска всъщност не е готов.
Средата, в която работех, беше Linux на raspberry pi. Тест за скорост на запис потвърждава, че моята скорост на запис на sd картата е малко над 1MB/s, което ще съответства на резултатите, които виждам, 20-30 секунди за запис на 30MB файл, не може да бъде направено за 500ms този хронометър 1 казва, че е така.
Друг потребител изглежда изпитва проблем поради това във File.WriteAllBytes прави не блокира
След добавяне на външен SSD USB HDD към raspberry pi и промяна на запазването на файла там вместо това, запазването на файла отнема само 0,5 секунди и проблемът изчезва.