forked from le0pard/postgresql_book
-
Notifications
You must be signed in to change notification settings - Fork 0
/
postgresql_cache.tex
26 lines (15 loc) · 3.75 KB
/
postgresql_cache.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
\chapter{Кэширование в PostgreSQL}
\begin{epigraphs}
\qitem{Чтобы что-то узнать, нужно уже что-то знать.}{Станислав Лем}
\end{epigraphs}
\section{Введение}
Кэш или кеш~--- промежуточный буфер с быстрым доступом, содержащий информацию, которая может быть запрошена с наибольшей вероятностью. Кэширование SELECT запросов позволяет повысить производительность приложений и снизить нагрузку на PostgreSQL. Преимущества кэширования особенно заметны в случае с относительно маленькими таблицами, имеющими статические данные, например, справочными таблицами.
Многие СУБД могут кэшировать SQL запросы, и данная возможность идет у них, в основном, <<из коробки>>. PostgreSQL не обладает подобным функционалом. Почему? Во-первых, мы теряем транзакционную чистоту происходящего в базе. Что это значит? Управление конкурентным доступом с помощью многоверсионности (MVCC~--- MultiVersion Concurrency Control)~--- один из механизмов обеспечения одновременного конкурентного доступа к БД, заключающийся в предоставлении каждому пользователю <<снимка>> БД, обладающего тем свойством, что вносимые данным пользователем изменения в БД невидимы другим пользователям до момента фиксации транзакции. Этот способ управления позволяет добиться того, что пишущие транзакции не блокируют читающих, и читающие транзакции не блокируют пишущих. При использовании кэширования, которому нет дела к транзакциям СУБД, <<снимки>> БД могут быть с неверными данными. Во-вторых, кеширование результатов запросов, в основном, должно происходить на стороне приложения, а не СУБД. В таком случае управление кэшированием может работать более гибко (включать и отключать его где потребуется для приложения), а СУБД будет заниматься своей непосредственной целью~--- хранением и обеспечение целостности данных.
Для организации кэширования существует два инструмента для PostgreSQL:
\begin{itemize}
\item Pgmemcache (с memcached)
\item Pgpool-II (query cache)
\end{itemize}
\input{cache/pgmemcache}
\section{Заключение}
Кэширование в PostgreSQL может быть реализованно с помощью различных утилит. Это показывает отличную гибкость PostgreSQL, но, как я думаю, оптимальным решением является, чтобы кешированием занималось другое решение (ваше приложение, Varnish, другое).