Pull to refresh

Comments 13

В PostgreSQL cost — это среднее время доступа до случайной страницы в БД, поэтому по количеству костов можно посчитать время.

Но эта величина тоже не стабильная и зависит от многих параметров. Например, если диск долгое время был загружен, средняя стоимость изменится, то есть показатель снова будет необъективным.

Ребяты, стоимость (cost) — это оценка планировщика. Она никак не зависит от нагрузки на сервер, скорости работы дисков и т. п. Для одного и того же запроса стоимость может поменяться только при изменении статистики (ну или изменении настроенных параметров).

И уж конечно по оценке стоимости никак нельзя вычислить время.

"По большому счету" оценка планировщика (статистика) может вполне поменяться со временем (не только от изменения параметров DB/OS, объема данных, но и от "расположения" данных на дисках и т.п. факторов).

Не очень понимаю, что такое "по большому счету", но:

  • оценка планировщика и статистика — разные вещи (статистика — входная информация для оценки);

  • статистика никак не учитывает характеристики железа, параметры ОС, расположение данных на дисках и т. п., а учитывает только объем и особенности распределения данных (в смысле мат. статистики);

  • такие факторы, как соотношение времени случайного и последовательного доступа и т. п., задаются администратором с помощью конфигурационных параметров; сами по себе эти настройки никогда не меняются.
    Возможно, кажется логичным, чтобы такие вещи отслеживались и учитывались автоматически, но нет: воспроизводимость и стабильность планов дороже. Про автономные/самонастраивающиеся СУБД давно говорят, но пока ни у кого хорошо не получается.

"Про автономные/самонастраивающиеся СУБД давно говорят, но пока ни у кого хорошо не получается." - компания Oracle и фактическая работа ее БД с вами не согласны... :-)
Т.е. при построении фактического плана исполнения учитывается "все что можно". Не только данные по статистике данных, но и "время отклика" и количество IO операций (причем с учетом "сколько читаем из памяти/буфера", а сколько c диска)....
Грубо говоря иногда оптимальнее/быстрее прочитать всю таблицу, чем читать ее индекс и потом данные из таблицы, а иногда наоборот...

Рад за Оракл, если им удалось добиться какого-то серьезного прогресса. Семь лет назад, когда я на нем сидел, все это было в сильно зачаточном состоянии. Правда, спрос на DBA не уменьшается, так что, боюсь, не все так гладко.

Но мы тут, вроде, про Постгрес говорили, а в нем такой автоматики в любом случае нет.

Ну видимо и по этой причине эти БД различаются...
А вот DBA нужны всегда, когда разработчики не знают/понимают (или не хотят) как принципы работы баз данных, так и специфику самих прикладных данных, они считают что "пусть база сама разрулит"... Вот (не думая) и пихают в БД свои xml и json в чистом виде (когда собственно данных там от силы 30-50%, а все остальное "обертки")... :-(

Про автономные/самонастраивающиеся СУБД давно говорят, но пока ни у кого хорошо не получается." - компания Oracle и фактическая работа ее БД с вами не согласны... :-)

Да и не только Oracle, все "большие" коммерческие СУБД в плане оптимизации запросов и автоматических подстроек под железо и текущую нагрузку, увы, на две головы впереди постгреса.

Постргес клёвый, но в нем оптимизировать все приходится вручную. Даже простейшие вещи, об оптимизации которых в Oracle или SQL Server вообще не задумываешься. А постгрес прямо с порога озадачивает вопросами про work_mem и max_connections. Ну, вон у тебя 64 гига памяти в сервере, неужели самому сложно решить, как ее разделить между пятью запросами?

Добрый день! Тут уже довольно большое обсуждение ?. Я передала ваш комментарий DBA Ивану Чувашову, эксперту из этой статьи. Ниже его ответ ⤵️

На самом деле стоимость может измеряться в произвольных единицах, определяемых параметрами планировщика (см. Подраздел 20.7.2 вот тут → https://postgrespro.ru/docs/postgresql/14/runtime-config-query. Традиционно единицей стоимости считается операция чтения страницы с диска; то есть seq_page_cost обычно равен 1.0, а другие параметры задаются относительно него. Например, в этом разделе выполняются со стандартными параметрами стоимости → https://postgrespro.ru/docs/postgresql/14/using-explain

По умолчанию эти переменные определяются относительно стоимости чтения последовательной страницы: то есть, переменную seq_page_cost удобно задать равной 1.0, а все другие переменные стоимости определить относительно неё. Но при желании можно использовать и другую шкалу, например, выразить в миллисекундах фактическое время выполнения запросов на конкретной машине.

Подкорректируйте, пожалуйста, ссылку на ютабчик

В сумме может получиться 450-500 страниц — это совсем немало. Учитывая, что объем одной страницы данных — 8 килобайт.

500*8к = 4 MB, это в 2022 году действительно "немало"?

Если бы было действительно так, то запрос бы пролетал максимум за десятки миллисекунд. Но у вас там план говорит совершенно другое:

Buffers: shared hit=13937, read=149998, dirtied=125912, temp read=30325 written=30382

А буфера как раз в страницах считаются. Т.е. у вас не 450-500 страниц прочиталось, а примерно 135000 (что логично, табличка-то под гигабайт должна быть, и просканировалась вся). И ещё 30000 страниц (250 MB) временно записалось на диск.

И вот это уже действительно "немало", отсюда и 4,5 секунды на запрос.

Добрый день! Тут уже довольно большое обсуждение ?. Я передала ваш комментарий DBA Ивану Чувашову, эксперту из этой статьи. Ниже его ответ

Хороший подход. А сам то Иван не может поучавствовать или статью писал не он?

Sign up to leave a comment.