2016-05-25 8 views
1

Я храню данные в столбце bytea в базе данных PostgreSQL 9.5 в Windows.Чтение данных bytea происходит медленно в PostgreSQL

Скорость передачи данных ниже, чем я ожидаю: около 1,5 мб в секунду.

Следующий код

 using (var conn = ConnectionProvider.GetOpened()) 
     using (var comm = new NpgsqlCommand("SELECT mycolumn FROM mytable", conn)) 
     using (var dr = comm.ExecuteReader()) 
     { 
      var clock = Stopwatch.StartNew(); 
      while (dr.Read()) 
      { 
       var bytes = (byte[])dr[0]; 
       Debug.WriteLine($"bytes={bytes.Length}, time={clock.Elapsed}"); 
       clock.Restart(); 
      } 
     } 

Производит следующий вывод

bytes=3895534, time=00:00:02.4397086 
bytes=4085257, time=00:00:02.7220734 
bytes=4333460, time=00:00:02.4462513 
bytes=4656500, time=00:00:02.7401579 
bytes=5191876, time=00:00:02.7959250 
bytes=5159785, time=00:00:02.7693224 
bytes=5184718, time=00:00:03.0613514 
bytes=720401, time=00:00:00.0227767 
bytes=5182772, time=00:00:02.7704914 
bytes=538456, time=00:00:00.2996142 
bytes=246085, time=00:00:00.0003131 
Total: 00:00:22.5199268 

Странным является то, что чтение последнего 246kb заняла меньше миллисекунды, и чтение 720KB в середине взял только 22ms.

Является ли скорость чтения 5 мб на 3 секунды нормальной? Как я могу увеличить скорость чтения?

Подробнее.

Мое приложение запускает PostgreSQL-сервер при запуске и закрывает его при выходе.

Я запустить сервер со следующим кодом

public static void StartServer(string dataDirectory, int port) 
{  
    Invoke("pg_ctl", $"start -w -D \"{dataDirectory}\" -m fast -o \"-B 512MB -p {port} -c temp_buffers=32MB -c work_mem=32MB\""); 
} 

Кроме того, я изменить тип хранения в моей колонке:

ALTER TABLE mytable ALTER COLUMN mycolumn SET STORAGE EXTERNAL; 

я использую npgsql 3.0.4.0 и PostgreSQL 9.5 на Windows 10

ответ

1

Запуск здесь с Npgsql 3.0.8 (должно быть одинаковым), PostgreSQL 9.5, Windows 10 и Npgsql. Я не получаю ваши результаты:

bytes=3895534, time=00:00:00.0022591 
bytes=4085257, time=00:00:00.0208912 
bytes=4333460, time=00:00:00.0228702 
bytes=4656500, time=00:00:00.0237144 
bytes=5191876, time=00:00:00.0317834 
bytes=5159785, time=00:00:00.0268229 
bytes=5184718, time=00:00:00.0159028 
bytes=720401, time=00:00:00.0130150 
bytes=5182772, time=00:00:00.0153306 
bytes=538456, time=00:00:00.0021693 
bytes=246085, time=00:00:00.0005174 

Во-первых, на каком сервере вы работаете, на локальном хосте или на удаленной машине?

Вторая вещь, которая приходит на ум, - это остановка и запуск сервера как часть теста. Медленная производительность, которую вы видите, может быть частью разминки на стороне PostgreSQL. Попытайтесь удалить его и посмотреть, можно ли воспроизвести результаты после нескольких попыток тестирования.

В противном случае это выглядит как проблема с окружающей средой (клиентская машина, серверная машина или сеть). Я попытался воспроизвести проблему на другой машине или в другой обстановке и перейти оттуда.

+0

Воспроизводится тот же код на другом компьютере и получил нормальные результаты. Итак, проблема в серверной машине. Вы хоть представляете, что это может быть? Я использую локальный сервер. Сервер работает как служба. Письмо намного медленнее. –

+1

Я бы начал с проверки загрузки вашего сервера во время выполнения теста - это CPU? Это IO? Я также посмотрел бы конфигурацию PostgreSQL (postgresql.conf), чтобы узнать, есть ли какая-то настройка ... –

 Смежные вопросы

  • Нет связанных вопросов^_^