Глядя на журнал сервера postgres, я вижу, что точно такой же запрос на том же сервере postgres выполняется намного дольше (примерно в 10 раз дольше) при вызове из клиента Linux или из клиента Windows.
Запросы исходят от приложения Django, работающего на компьютере с Linux с 4 ГБ ОЗУ и на компьютере с Windows с 8 ГБ ОЗУ. Обе среды pyhon имеют библиотеку psycopg2 версии 2.4.4 для отправки запросов на один и тот же сервер postgres.
Ниже приведены логи сервера postgres.
Запрос Windows (со временем):
2013-06-11 12:12:19 EEST [unknown] 10.1.3.152(56895) mferreiraLOG: duration: 3207.195 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk' )
Запрос Linux (намного дольше):
2013-06-11 12:12:56 EEST [unknown] 10.1.3.154(35325) mferreiraLOG: duration: 22191.773 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk' )
выполнение прямо из psql (самое быстрое):
2013-06-11 12:19:06 EEST psql [local] mferreiraLOG: duration: 1332.902 ms statement: SELECT "autotests_tracerperformance"."id", "autotests_tracerperformance"."date", "autotests_tracerperformance"."video_id", "autotests_tracerperformance"."revision_id", "autotests_tracerperformance"."computer_id", "autotests_tracerperformance"."probe", "autotests_tracerperformance"."time_tostart", "autotests_tracerperformance"."hang_atstart", "autotests_tracerperformance"."time_tohang", "autotests_tracerperformance"."hang", "autotests_tracerperformance"."crash", "autotests_tracerperformance"."stacktrace", "autotests_tracerperformance"."framemax", "autotests_tracerperformance"."maxtime", "autotests_tracerperformance"."avgtime" FROM "autotests_tracerperformance" INNER JOIN "revisions" ON ("autotests_tracerperformance"."revision_id" = "revisions"."id") WHERE ("autotests_tracerperformance"."computer_id" = 61 AND "revisions"."repo" = 'Trunk' );
Другие запросы, которым не нужно загружать так много элементов из базы данных, выполняются почти так же.
Почему такая большая разница во времени между клиентами для этого запроса?
Примечание. Время передачи не имеет значения, так как все машины находятся в одной интрасети. Кроме того, более медленное время наблюдается, когда клиентский запрос поступает с той же машины Linux, на которой работает сервер postgresql.
Примечание 2. Psycopg2 устанавливался по-разному в Windows и Linux. В то время как в Windows я установил его из предварительно упакованного двоичного файла, в Linux я запустил «pip install psycopg2», который опирается на установку postgresql, доступную в системе. Может ли это привести к различным значениям параметров, влияющих на производительность на стороне клиента (например, параметр work_mem)?