PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

C#, Entity Framework Core &PostgreSql:вмъкването на един ред отнема 20+ секунди

След много тестове в крайна сметка открих, че проблемът изобщо не е в 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 секунди и проблемът изчезва.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Продължавам да получавам връзката за грешка [TABLE] не съществува

  2. Безопасно преименувайте таблици, като използвате колони от сериен първичен ключ

  3. PostgreSQL в Helm:параметър initdbScripts

  4. org.postgresql.util.PSQLException:Индексът на колоната е извън диапазона:3, брой колони:2

  5. Защо не може да се създаде таблица за разделяне