pgpool-II не кэширует некоторые запросы, хотя должен - PullRequest
0 голосов
/ 20 мая 2019

У меня есть сервер PostgreSQL, работающий на 10.6 с дистрибутивом openSUSE для Linux, и я просто настроил pgpool-II, чтобы позволить мне кэшировать запросы.Это работает в основном нормально, но по неизвестным причинам иногда я получаю это предупреждение:

WARNING: memcache: adding table oid maps, failed to create directory:"/var/log/pgpool/oiddir". error:"No such file or directory"

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

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

Но у меня также есть другая проблема, и я не знаю, связана ли она с первой:

Когда я пишу большие запросы (с использованием JOIN, подзапросов, множества условий и т. Д.), Pgpool-II не будет кэшировать их результаты (или кэшировать, но не использовать, я понятия не имею), хотярезультаты не большие (менее 500 строк).Кроме того, в этом случае я не получаю предупреждение "oid".Я попытался увеличить различные пределы разделяемой памяти, которую разрешено использовать pgpool-II (см. документация ), но он ничего не изменил, как я ожидал, потому что, когда pgpool-II не удается кэшировать запрос из-за отсутствия доступныхсовместно используемая память, она должна возвращать такое сообщение:

LOG: pid 13756: pool_add_temp_query_cache: data size exceeds memqcache_maxcache. current:4095 requested:111 memq_maxcache:4096

Но в моем случае я не получаю никакого сообщения.Ниже приведены примеры обоих случаев.


1-я проблема

  • Простой запрос, результат кэшируется, ошибка "oid":
SELECT *
FROM some_table


WARNING: memcache: adding table oid maps, failed to create directory:"/var/log/pgpool/oiddir". error:"No such file or directory"

-- Doing it a second time will just give me the cached result without any warning, as expected

2-я проблема

  • Сложный запрос, результат не кэшируется (или не кэшируется и не используется), без предупреждения / сообщения об ошибке:
SELECT A.geom, A.id, to_char(C.timestamp, 'DD/MM/YY') as date, C.timestamp::time as time, ROUND(C.value) as value
FROM segments A, lines B, ( SELECT DISTINCT ON (B.id) B.id, A.timestamp, ROUND(A.nb1+A.nb2+A.nb3) as value
                            FROM records A
                            CROSS JOIN LATERAL (SELECT *
                                                FROM points B
                                                WHERE A.id = B.id
                                                AND A.direction = B.direction
                                                ORDER BY A.position <-> B.geom
                                                LIMIT 1) AS B
                            ORDER BY B.id, A.timestamp DESC) AS C
WHERE A.id = B.id
AND B.id = C.id
AND A.direction = B.direction
AND B.direction = C.direction


-- Doing it a second time will just directly request the PostgreSQL server again, instead of pulling the result from the cache, as it should if the result was cached.
...