- PVSM.RU - https://www.pvsm.ru -

Замедляем выполнение запросов в PostgreSQL

Замедляем выполнение запросов в PostgreSQL
Кому-то может показаться странным заголовок поста. И правда, зачем в здравом уме тормозить выполнение запросов на сервере?

Я вот отвечу: «Чтобы проверить как работает интерфейс программы-клиента во время длительных запросов». Такая задача возникла предо мной во время реализации импорта структуры базы для нашего ER-дизайнера [1].

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

  1. Радовать глаз пользователя всякого рода статистикой и анимацией(?).
  2. Не дать пользователю нажать или сделать что-то не то.
  3. С другой стороны, обязательно дать возможность остановить длительный процесс.

Никто, конечно, не запрещает вставлять всякие sleep() в код програмы-клиента, но есть в этом что-то от лукавого. А можно использовать встроенную функцию pg_sleep() [2], параметром которой может быть передано количество секунд, на которое нужно остановить исполнение запроса.

SELECT pg_sleep(1.5);

Давайте затормозим запрос, возвращающий список таблиц в базе:

SELECT oid :: regclass
FROM pg_class
WHERE relkind = 'r'

Пример 1

Можно поместить вызов pg_sleep() в раздел FROM:

SELECT oid::regclass
FROM pg_class, pg_sleep(10)
WHERE relkind = 'r'

В таком случае функция выполнится всего один раз и общее время исполнения будет около 10 секунд. Более того, весь набор данных вернется сразу целиком.

Пример 2

Можно поместить вызов pg_sleep() в раздел SELECT:

SELECT oid::regclass, pg_sleep(1)
FROM pg_class
WHERE relkind = 'r'

В этом же случае функция выполнится по одному разу для каждой строки набора данных. А именно столько раз, сколько таблиц имеется в вашей базе. При таком подходе есть еще один плюс. Используя асинхронную обработку запроса, например так [3] или эдак [4], можно получать строку одну за одной, и радовать пользователя, медленно ползущим прогресс-баром.

Всех вам благ!

Автор: pasha_golub

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/postgresql/19150

Ссылки в тексте:

[1] ER-дизайнера: http://microolap.com/products/database/postgresql-designer/

[2] pg_sleep(): http://www.postgresql.org/docs/9.2/static/functions-datetime.html

[3] так: http://www.postgresql.org/docs/9.2/static/libpq-async.html

[4] эдак: http://www.postgresql.org/docs/9.2/static/libpq-single-row-mode.html

[5] Источник: http://habrahabr.ru/post/157505/