powered by simpleCommunicator - 2.0.27     © 2024 Programmizd 02
Map
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Дольше выполняется тот же запрос после выполнения ANALYZE на базе
11 сообщений из 11, страница 1 из 1
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
    #40137988
rdm-30
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
Имеем несколько инстансов 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
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
    #40137989
rdm-30
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема опубликована.
...
rdm-30:
Тема опубликована.
Рейтинг: 0 / 0
Дольше выполняется тот же запрос после выполнения ANALYZE на базе
    #40137992
Горбатый ёж
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rdm-30 [игнорируется] 

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

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

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

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

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

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

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


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