Я исследую несколько медленных запросов, и мне нужна помощь в чтении полученных данных.
У нас есть один конкретный запрос, который использует индекс и в большинстве случаев выполняется довольно быстро, однако время от временивремя, которое оно работает медленно (700 мс +), не знаю почему.
Limit (cost=8.59..8.60 rows=1 width=619) (actual time=5.653..5.654 rows=1 loops=1)
-> Sort (cost=8.59..8.60 rows=1 width=619) (actual time=5.652..5.652 rows=1 loops=1)
Sort Key: is_main DESC, id
Sort Method: quicksort Memory: 25kB
-> Index Scan using index_pictures_on_imageable_id_and_imageable_type on pictures (cost=0.56..8.58
rows=1 width=619) (actual time=3.644..5.587 rows=1 loops=1)
Index Cond: ((imageable_id = 12345) AND ((imageable_type)::text = 'Product'::text))
Filter: (tag = 30)
Rows Removed by Filter: 2
Planning Time: 1.699 ms
Execution Time: 5.764 ms
Если я правильно понимаю, я бы сказал, что почти вся стоимость запроса приходится на сканирование индекса, верно? это звучит хорошо для меня, так почему же один и тот же запрос иногда выполняется довольно медленно?
Я начал думать, что, возможно, наш экземпляр не может сохранить весь индекс в памяти, поэтому он использует диск время от временико времени. Это объясняет медленные запросы. Тем не менее, это над моей головой. Имеет ли это смысл?
В этой таблице около 15 миллионов строк и 5156 MB
по размеру. Индекс 1752 MB
. Кстати, это индекс btree
.
Наш PostgreSQL находится на «высокодоступном» экземпляре Google Cloud SQL. Он имеет 2 виртуальных ЦП и 7,5 ГБ оперативной памяти. Вся наша база данных имеет размер около 35 ГБ.
Потребление ЦП практически никогда не превышает 40%. Обычно он составляет около 20-30%.
Проверяя график памяти экземпляра, я заметил, что потребление увеличивается до ~ 4 ГБ, затем оно падает до ~ 700 МБ и снова начинает расти. Это повторяющийся паттерн.
Теоретически, экземпляр имеет 7,5 ГБ ОЗУ, но я не знаю, предполагается ли все это доступно для PostgreSQL. В любом случае, ~ 3,5 ГБ только для ОС звучит довольно высоко, верно?
График памяти
Я прочитал, что эти настройки важны, поэтому выкидываю их сюда (Cloud SQL по умолчанию):
shared_buffers | 318976
temp_buffers | 1024
work_mem | 4096
Учитывая, что у нас есть куча других таблиц и индексов, разумно ли предположить, что если один только индекс равен 1,7 ГБ, то 7,5 ГБ для всего экземпляра слишком мало?
Можно ли как-то утверждать, есть ли у нас проблемы с памятью или нет?
Я ценю вашу помощь.