powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / разное время выполнения запроса, как понять?
10 сообщений из 10, страница 1 из 1
разное время выполнения запроса, как понять?
    #34812101
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть большая таблица - около 10 млн записей, в ней три Full-text поля-вектора.

Делаю запрос:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

-------

3 минуты

тут же второй раз:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

2 секунды.

??
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34812112
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот план после второго выполнения:
explain select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;
QUERY PLAN
-----------------------------------------------------------------------------------------
Limit (cost=0.00..404.21 rows=100 width=1659)
-> Index Scan using xstring_idx on xprop (cost=0.00..24656.94 rows=6100 width=1659)
Index Cond: (xstring_vector @@ '''mansur'' & ''haber'''::tsquery)
Filter: (xstring_vector @@ '''mansur'' & ''haber'''::tsquery)
(4 rows)
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34812918
iz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iz
Гость
Winnipuhесть большая таблица - около 10 млн записей, в ней три Full-text поля-вектора.

Делаю запрос:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

-------

3 минуты

тут же второй раз:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

2 секунды.

??

Данные после первого запроса поднимаются либо в дисковый кеш операционной системы, либо, если позволяют размеры, в разделяемую память (shared_buffers). Поэтому при втором запуске запроса не требуется чтения с физического носителя.
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34813348
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iz Winnipuhесть большая таблица - около 10 млн записей, в ней три Full-text поля-вектора.

Делаю запрос:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

-------

3 минуты

тут же второй раз:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

2 секунды.

??

Данные после первого запроса поднимаются либо в дисковый кеш операционной системы, либо, если позволяют размеры, в разделяемую память (shared_buffers). Поэтому при втором запуске запроса не требуется чтения с физического носителя.

Во как, интересно.
это именно для этого запроса?
а сколько времени результат будет храниться и выбираться из кеша?
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34813389
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuh
Во как, интересно.
это именно для этого запроса?
а сколько времени результат будет храниться и выбираться из кеша?
1. Для любых запросов
2. ИМХО до тех пор пока не выбьется из него другими.
Из кеша ОС - согласно политики кеша ОС, из шаред_буферов - согласно алгоритмам PG.
Про алгоритмы PG вроде на форуме несколько лет назад были ссылки и упоминания.

ЗЫ ИМХО просто нужно потестить на Вашей платформе/сервер/клиентах/запросах.
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34813437
iz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iz
Гость
Andrey Daeron Winnipuh
Во как, интересно.
это именно для этого запроса?
а сколько времени результат будет храниться и выбираться из кеша?
1. Для любых запросов
2. ИМХО до тех пор пока не выбьется из него другими.
Из кеша ОС - согласно политики кеша ОС, из шаред_буферов - согласно алгоритмам PG.
Про алгоритмы PG вроде на форуме несколько лет назад были ссылки и упоминания.


все верно
разделяемые буфера обрабатываются по немного видоизмененному LRU-алгоритму (least recently used), если быть точным -- по LRU/K-алгоритму. если интересно, чуть подробнее можно прочитать в известной статье Бартунова "Что такое PostgreSQL", например, здесь: http://postgresmen.ru/articles/view/57 , см. абзац "Управление буферами в PostgreSQL".
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34813441
Winnipuh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я понимаю, что для любых запросов, некорректно задал вопрос.
Имелось в виду анализируются ли производные запросы от закешированного .

проверил такое

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & (kara | haber)') limit 100;
после 1 го раза закешировался, ок.

потом делаю такой запрос:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

и он тоже довольно резво выполняется. Может быть ПГ распознает его каким-то образом как "производный"?
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34815060
iz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iz
Гость
Winnipuh
Имелось в виду анализируются ли производные запросы от закешированного .

проверил такое

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & (kara | haber)') limit 100;
после 1 го раза закешировался, ок.

потом делаю такой запрос:

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100;

и он тоже довольно резво выполняется. Может быть ПГ распознает его каким-то образом как "производный"?

PostgreSQL не анализирует "похожесть" запросов, он просто кеширует данные и индексы в памяти. Очевидно, эти два запроса у вас вызывают индекс-скан по одному и тому же индексу. Поэтому после первого запроса, индекс поднимается с диска в память и второй запрос (пусть и отличный от первого) пробегает по индексу, находящемуся уже в памяти.
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34815309
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Winnipuhselect * from xprop where xstring_vector @@ to_tsquery('default','mansur & (kara | haber)') limit 100;

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100; izОчевидно, эти два запроса у вас вызывают индекс-скан по одному и тому же индексу. Поэтому после первого запроса, индекс поднимается с диска в память и второй запрос (пусть и отличный от первого) пробегает по индексу, находящемуся уже в памяти.ИМХО, точнее сказать, что в общем случае с диска в память поднимается не весь индекс целиком, а лишь те индексные и табличные(!) страницы, на которых находятся данные, необходимые для выполнения данного запроса. Так как данные для второго запроса (mansur, haber) являются подмножеством данных для первого (mansur, kara, haber), то в идеале диск при втором запросе читаться не будет. Если бы например второй запрос был по словам (mansur, abrakadabra), то частично использовались бы данные, закэшированные в памяти, а частично - прочитались бы с диска.
...
Рейтинг: 0 / 0
разное время выполнения запроса, как понять?
    #34815350
iz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iz
Гость
LeXa NalBat Winnipuhselect * from xprop where xstring_vector @@ to_tsquery('default','mansur & (kara | haber)') limit 100;

select * from xprop where xstring_vector @@ to_tsquery('default','mansur & haber') limit 100; izОчевидно, эти два запроса у вас вызывают индекс-скан по одному и тому же индексу. Поэтому после первого запроса, индекс поднимается с диска в память и второй запрос (пусть и отличный от первого) пробегает по индексу, находящемуся уже в памяти.ИМХО, точнее сказать, что в общем случае с диска в память поднимается не весь индекс целиком, а лишь те индексные и табличные(!) страницы, на которых находятся данные, необходимые для выполнения данного запроса. Так как данные для второго запроса (mansur, haber) являются подмножеством данных для первого (mansur, kara, haber), то в идеале диск при втором запросе читаться не будет. Если бы например второй запрос был по словам (mansur, abrakadabra), то частично использовались бы данные, закэшированные в памяти, а частично - прочитались бы с диска.

да, именно так, спасибо за уточнение
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / разное время выполнения запроса, как понять?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]