Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Дольше выполняется тот же запрос после выполнения ANALYZE на базе / 11 сообщений из 11, страница 1 из 1
07.09.2023, 15:50
    #40137988
rdm-30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
Добрый день,
Имеем несколько инстансов PostgreSQL, версия 14.5 (Debian 14.5-2.pgdg110+2)
Заметили что, один и тот же запрос вида
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
WITH FLTRECIPECATEGORY AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeCategory"),
  FLTRECIPETAGS AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeTags"),
  FLTRECIPECOOKINGWAY AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeCookingWay"),
  FLTRECIPECOMPLEXITY AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeComplexity"),
  FLTRECIPEDESCRIPTIONS AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeDescriptions") ,
  FLTRECIPEDESCRIPTIONSTEPS AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeDescriptionSteps"),
  FLTRECIPEPROPS AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeProps"),
  FLTRECIPEINGREDIENTS AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeIngredients"),
  FLTRECIPEDESCRIPTIONINGREDIENTS AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeDescriptionIngredients"),
  FLTRECIPEDESCRIPTIONPROPERTIES AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipeDescriptionProperties"),
  FLTRECIPE AS
  (SELECT *
    FROM PUBLIC."vw_rct_fltRecipe"),
  FLTRECIPEDEVICE AS
  (SELECT *
    FROM PUBLIC."vw_rct_flt_RecipeDevice") ,
  RECIPESLANGUAGES AS
  (SELECT DISTINCT TRT.IDRECIPE,
      TRT.IDLANGUAGE,
      ROW_NUMBER() OVER() AS NUM_POS
    FROM
      (SELECT RT.IDRECIPE,
          RT.IDLANGUAGE
        FROM PUBLIC."RecipeTranslate" RT
        JOIN FLTRECIPEDESCRIPTIONINGREDIENTS ON FLTRECIPEDESCRIPTIONINGREDIENTS.IDRECIPE = RT.IDRECIPE
        AND FLTRECIPEDESCRIPTIONINGREDIENTS.IDLANGUAGE = RT.IDLANGUAGE
        WHERE RT.IDLANGUAGE = 1
          AND LOWER(CAST(FLTRECIPEDESCRIPTIONINGREDIENTS.INGREDIENTS AS CHARACTER varying)) like LOWER('%перец%')
        ORDER BY RT.NAME ASC) TRT) ,
  RECIPESLIST AS
  (SELECT *
    FROM
      (SELECT RL.IDRECIPE,
          MIN(RL.NUM_POS) NUM_POS
        FROM RECIPESLANGUAGES RL
        GROUP BY RL.IDRECIPE) TT
    ORDER BY NUM_POS
    LIMIT 15
    OFFSET 0),
  RECIPESLISTCOUNT AS
  (SELECT COUNT(*) CNT
    FROM
      (SELECT RL.IDRECIPE
        FROM RECIPESLANGUAGES RL
        GROUP BY RL.IDRECIPE) WWW) ,
  LANGUAGESARRAY AS
  (SELECT ARRAY_AGG(DISTINCT RL.IDLANGUAGE)
    FROM RECIPESLANGUAGES RL)
SELECT CNT,
  RECIPESLIST.NUM_POS,
  PUBLIC."getRecipeJSON"(RECIPESLIST.IDRECIPE ,
                                                  (SELECT *
                                                    FROM LANGUAGESARRAY) , ARRAY[FALSE ,
                                                  FALSE ,
                                                  FALSE ,
                                                  FALSE ,
                                                  FALSE ,
                                                  FALSE ])
FROM RECIPESLIST,
  RECIPESLISTCOUNT
ORDER BY RECIPESLIST.NUM_POS --  arr  {"arr": ["1","%перец%"]}
выполняется на тестовом сервере, по сравнению с сервером где БД была изначально развернута на порядок медленнее (18-20 секунд по сравнению с 0,6 сек). Далее когда начали разбираться заметили что данное замедление происходит после выполнения ANALYZE, что довольно парадоксально.
Если статистику обнулить выполнив в контексте базы

set allow_system_table_mods = true;
truncate pg_statistic;

То запрос снова начинает выполнятся быстро.
Прошу подсказать в какую сторону копать и в чем может быть причина данного поведения.
План выполнения быстрого запроса во вложении:
explain_plan_fast.svg
fast_query.jpg
План выполнения медленного запроса во вложении:
explain_plan_slow.svg
slow_query.jpg
...
Рейтинг: 0 / 0
rdm-30:
Тема опубликована.
08.09.2023, 12:53
    #40137992
Горбатый ёж
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
rdm-30 [игнорируется] 

А в текстовом виде нет планов?
ЗЫ но я бы начал с проверки настроек первоначальной БД и той, на которой замедление.
...
Рейтинг: 0 / 0
11.09.2023, 10:54
    #40138009
rdm-30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
Горбатый ёж [игнорируется] 

БЫСТРЫЙ ПЛАН
fast-plan.txt
МЕДЛЕННЫЙ ПЛАН

здесь более загадочно если делать EXPLAIN "запрос" то время выполнения показывает меньше, чем реальное выполнение запроса в PGAdmin (19 сек)
а если Shift-F7 в PGAdmin со всеми выбранными опциями то время показывает как при реальном выполнении запроса. Поэтому изначально выложил в виде svg-шек
...
Рейтинг: 0 / 0
11.09.2023, 11:21
    #40138010
rdm-30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
Горбатый ёж [игнорируется] 

Результат EXPLAIN ANALYZE для медленного плана
slow-plan.txt
...
Рейтинг: 0 / 0
11.09.2023, 11:32
    #40138011
Горбатый ёж
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
rdm-30 [игнорируется] 

У вас планы абсолютно разные, используют разные индексы.
Чем отличаются БД?
Возможно они отличаются наполнением, например у медленного запроса и данных больше гораздо, вполне естественно, что тогда и план может быть перестроен оптимизатором.
Можете попробовать прибить план гвоздями хинтами, но за ним конечно придётся следить в дальнейшем.
ЗЫ по хорошему запрос нужно переписать, к нему очень много вопросов, по крайней мере у меня, но разбирать без погружения в предметную область я это не буду.
...
Рейтинг: 0 / 0
11.09.2023, 11:48
    #40138012
rdm-30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
Горбатый ёж [игнорируется] 
EXPLAIN ANALYZE быстрого запроса
fast-plan.txt
...
Рейтинг: 0 / 0
11.09.2023, 11:56
    #40138013
rdm-30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
Горбатый ёж [игнорируется] 

БД одна и та же на одном и том же инстансе Postgres. Разница только в наличии актуальной статистики. На самом деле запрос уже переписали и на новом запросе такого эффекта не возникает. Но хотелось бы понять причину такого поведения.
...
Рейтинг: 0 / 0
11.09.2023, 20:41
    #40138030
Горбатый ёж
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
rdm-30  11.09.2023, 11:56
[игнорируется]
хотелось бы понять причину такого поведения.
Причина в том, что на свежей аналитике оптимизатор считает, что так будет эффективнее. Элементарно после сбора оказалоиь, что в таблице например ингридиентов не 2000 записей, а 2 миллиарда, как следствие по своим правилам оптимизатор принимает решение об использовании того или иного плана.
Почему он так считает и принимает именно такое решение? На этот вопрос смогут ответить разработчики оптимизатора, но им скорее всего понадобится рабочий пример БД.
В свою очередь разработчику всегда следует помнить, что любой оптимизатор может ошибаться. Поэтому для корректировки и есть хинты.
...
Изменено: 11.09.2023, 20:42 - Горбатый ёж
Рейтинг: 1 / 0
13.09.2023, 10:26
    #40138047
rdm-30
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
Горбатый ёж [игнорируется] 

Это понятно. Но данные в тестовую базу никто не вставлял, только выполняется ANALYZE и после запрос начинает работать совсем по-другому.
...
Рейтинг: 0 / 0
13.09.2023, 22:20
    #40138048
Горбатый ёж
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
rdm-30  13.09.2023, 10:26
[игнорируется]
только выполняется ANALYZE и после запрос начинает работать совсем по-другому
Потому что статистика обновилась.
Если вам так интересно, то посмотрите статистику на тестовой базе до и после analyze
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Дольше выполняется тот же запрос после выполнения ANALYZE на базе / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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