Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорить простой запрос с CTE 
:(
    Опции темы
polin11
Дата 8.7.2023, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 6.6.2015

Репутация: нет
Всего: нет



Использую PGSQL, есть простой запрос, 
    
Код

    
    EXPLAIN (ANALYZE,BUFFERS)
    WITH data_to_cte AS (
        SELECT
            unnest[1]::integer account
        ,    unnest[2]::text user_id
        ,    unnest[3]::integer target_id
        FROM
            (
                SELECT
                    unnest('{ "{ 7267996,4,96394594 }" }'::text[])::text[]
            ) f
    )
    SELECT
        "DocumentsId",
        data_to_cte.*
    FROM
        data_to_cte
    JOIN
        "Documents"
            on "Account" = account AND 
            "Target" = target_id and
            "User" = user_id  AND
            "User" IS NOT NULL
    

план такой


Код

Nested Loop  (cost=0.58..8.68 rows=1 width=48) (actual time=23.352..23.353 rows=0 loops=1)
  Buffers: shared hit=16730
  ->  Result  (cost=0.00..0.04 rows=1 width=32) (actual time=0.008..0.012 rows=1 loops=1)
        ->  ProjectSet  (cost=0.00..0.02 rows=1 width=32) (actual time=0.004..0.007 rows=1 loops=1)
              ->  Result  (cost=0.00..0.01 rows=1 width=0) (actual time=0.002..0.002 rows=1 loops=1)
  ->  Index Scan using "iDocuments-AccountUser" on "Documents"  (cost=0.58..8.61 rows=1 width=28) (actual time=23.334..23.334 rows=0 loops=1)
        Index Cond: (("Account" = (((((unnest('{"{ 7267996,4,96394594 }"}'::text[])))::text[]))[1])::integer) AND ("User" = ((((unnest('{"{ 7267996,4,96394594 }"}'::text[])))::text[]))[2]))
        Filter: ((((((unnest('{"{ 7267996,4,96394594 }"}'::text[])))::text[]))[3])::integer = "Target")
        Rows Removed by Filter: 19163
        Buffers: shared hit=16730
Planning Time: 0.318 ms
Execution Time: 23.397 ms


    
Хочется чтобы использовался такой индекс
Код


CREATE INDEX "iDocuments-AccountTarget"
    ON "Documents" USING btree
    ("Account" NULLS LAST, "Target" NULLS LAST, "User" NULLS LAST)
    WHERE ("User" IS NOT NULL);
    

Что нужно сделать, возможно переписать запрос?

Например, если указать напрямую Target, то используется нужный индекс

    
Код

EXPLAIN (ANALYZE,BUFFERS)
    WITH data_to_cte AS (
        SELECT
            unnest[1]::integer account
        ,    unnest[2]::text user_id
        ,    unnest[3]::integer target_id
        FROM
            (
                SELECT
                    unnest('{ "{ 7267996,4,96394594 }" }'::text[])::text[]
            ) f
    )
    SELECT
        "DocumentsId",
        data_to_cte.*
    FROM
        data_to_cte
    JOIN
        "Documents"
            on "Account" = account AND 
            "Target" = 4 and
            "User" = user_id  AND
            "User" IS NOT NULL

            
PM MAIL   Вверх
Akina
Дата 11.7.2023, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 3
Всего: 453



А какой тип данных у поля Target? Текстовое? Тогда есть смысл рассмотреть изменение индекса и перемещение этого поля на третью позицию. А если числовое, то просто привести его не к text, а к integer в CTE.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PostgreSQL | Следующая тема »


 




[ Время генерации скрипта: 0.1014 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.