- PVSM.RU - https://www.pvsm.ru -
Кому-то может показаться странным заголовок поста. И правда, зачем в здравом уме тормозить выполнение запросов на сервере?
Я вот отвечу: «Чтобы проверить как работает интерфейс программы-клиента во время длительных запросов». Такая задача возникла предо мной во время реализации импорта структуры базы для нашего ER-дизайнера [1].
Интерфейс программы, по моему скромному мнению, во время длительных запросов должен обеспечить три аспекта:
Никто, конечно, не запрещает вставлять всякие sleep() в код програмы-клиента, но есть в этом что-то от лукавого. А можно использовать встроенную функцию pg_sleep() [2], параметром которой может быть передано количество секунд, на которое нужно остановить исполнение запроса.
SELECT pg_sleep(1.5);
Давайте затормозим запрос, возвращающий список таблиц в базе:
SELECT oid :: regclass
FROM pg_class
WHERE relkind = 'r'
Можно поместить вызов pg_sleep() в раздел FROM:
SELECT oid::regclass
FROM pg_class, pg_sleep(10)
WHERE relkind = 'r'
В таком случае функция выполнится всего один раз и общее время исполнения будет около 10 секунд. Более того, весь набор данных вернется сразу целиком.
Можно поместить вызов 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/
Нажмите здесь для печати.