powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / use index foreign table
18 сообщений из 18, страница 1 из 1
use index foreign table
    #40061021
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, подскажите, не нашел в доках. Ситуация такая
есть таблица T1 с полем date на которое навесил индекс date_idx

select * from schema.T1 where c_date>current_date использует индекс date_idx

Цепляю эту таблицу как внешнюю на другом сервере
Этот же запрос уже индекс не использует.
select * from foreign_schema.T1 where c_date>current_date

Где можно про это почитать подскажите пожалуйста!
...
Рейтинг: 0 / 0
use index foreign table
    #40061039
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff,

Код: sql
1.
where c_date > date 'now'


либо другая константа.
current_date не константа и автоматически в константу не переписывается.

Вопрос не в индексе, а в том, какой запрос отправляет fdw. В explain (verbose) это будет видно
...
Рейтинг: 0 / 0
use index foreign table
    #40061119
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

date 'now' это тоже не константа. Это же вычисляемое значение!? абсолютно такая же

Дело в в неиспользовании индексов. Сталкиваюсь уже не первый раз поэтому это точно. Вопрос почему и что можно сделать.

Один и тот же запрос

План первого запроса
Buffers: shared hit=5 read=2
-> Index Scan using idx_date on T1 (cost=0.43..576.83 rows=18119 width=44) (actual time=16.097..16.101 rows=10 loops=1)
Index Cond: (c_date > '2021-04-09'::date)
Buffers: shared hit=5 read=2
Planning time: 0.981 ms
Execution time: 16.134 ms

План второго
-> Foreign Scan on T1 (cost=100.00..140.11 rows=401 width=44) (actual time=13029.820..81112.138 rows=10 loops=1)
Filter: (c_date > '2021-04-09'::date)
Rows Removed by Filter: 8215940
Planning Time: 1.345 ms
Execution Time: 81159.278 ms
...
Рейтинг: 0 / 0
use index foreign table
    #40061136
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff,

Таки с c_date > date 'now' работает по индексу или нет при fdw?
А с c_date > '2021-04-09'::date тоже через fdw?


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
use index foreign table
    #40061139
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
Melkij,

date 'now' это тоже не константа. Это же вычисляемое значение!? абсолютно такая же

Именно что константа и именно абсолютно не такая же, как current_date.
Я ведь на всякий случай даже проверил прежде чем отправить сообщение.

Повторю: посмотрите какой запрос отправляет fdw.
...
Рейтинг: 0 / 0
use index foreign table
    #40061162
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk
kliff,

Таки с c_date > date 'now' работает по индексу или нет при fdw?
А с c_date > '2021-04-09'::date тоже через fdw?


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


в первом посте я написал какой первый, а какой второй запрос. А во втором посте привел их планы.

В плане видно, что не работает по индексу. Хоть так date 'now' хоть так '2021-04-09'::date
...
Рейтинг: 0 / 0
use index foreign table
    #40061164
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij
kliff
Melkij,

date 'now' это тоже не константа. Это же вычисляемое значение!? абсолютно такая же

Именно что константа и именно абсолютно не такая же, как current_date.
Я ведь на всякий случай даже проверил прежде чем отправить сообщение.

Повторю: посмотрите какой запрос отправляет fdw.


ну планы и время идентичные почти

current_date Index Cond: (date_end > ('now'::cstring)::date)

date 'now' Index Cond: (date_end > '2021-04-09'::date)

--какой запрос отправляет fdw
fdw а где это посмотреть?
...
Рейтинг: 0 / 0
use index foreign table
    #40061168
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
Maxim Boguk
kliff,

Таки с c_date > date 'now' работает по индексу или нет при fdw?
А с c_date > '2021-04-09'::date тоже через fdw?


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru


в первом посте я написал какой первый, а какой второй запрос. А во втором посте привел их планы.

В плане видно, что не работает по индексу. Хоть так date 'now' хоть так '2021-04-09'::date


Покажите
1)explain (verbose) для случая с '2021-04-09'::date
2)покажите какой тип данных у поля c_date (а то всякое бывает)
3)use_remote_estimate включен на fdw?
4)analyze таблицы делали (на удаленной стороне)


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
use index foreign table
    #40061225
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
--какой запрос отправляет fdw
fdw а где это посмотреть?

Я же сразу написал: в explain (verbose) это будет видно

И какая версия базы, где стоит fdw? И postgres_fdw ли это вообще или какой-то из generic fdw?
...
Рейтинг: 0 / 0
use index foreign table
    #40061307
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Melkij,

да, стоит postgres_fdw. Версия PG 12.5
...
Рейтинг: 0 / 0
use index foreign table
    #40061308
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

делаю лимит 10, иначе запрос висит вечно

1)
Limit (cost=100.00..100.99 rows=10 width=4) (actual time=5530.590..36439.849 rows=10 loops=1)
Output: id
-> Foreign Scan on t1 (cost=100.00..196.06 rows=975 width=4) (actual time=5530.588..36439.842 rows=10 loops=1)
Output: id
Filter: (c_date > '2021-04-09'::date)
Rows Removed by Filter: 8215940
Remote SQL: SELECT id, c_date FROM t1
Planning Time: 1.542 ms
Execution Time: 36517.025 ms

2)timestamptz NOT NULL,
3)после создания сервера делал
ALTER SERVER db_srv_load
OPTIONS (ADD use_remote_estimate 'true');
4)да
...
Рейтинг: 0 / 0
use index foreign table
    #40061358
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
Maxim Boguk,

2)timestamptz NOT NULL,


Блин вы же выше написали "таблица T1 с полем date"
а там дрова лежат как я и ожидал (в смысле timestamptz)
потому и не работает и работать по другому не может...

потому что приведение timestamptz к дате - операция неоднозначная и зависит от настроек сервера и клиента.
поэтому одно и тоже условие может на разных серверах разное давать
и поэтому fdw будет фильтровать на получателе.


Пример
Код: 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.
mboguk=# select now();
              now              
-------------------------------
 2021-04-10 17:23:33.043462+03
(1 row)

mboguk=# select '2021-04-10 17:23:33.043462+03'::timestamptz;
          timestamptz          
-------------------------------
 2021-04-10 17:23:33.043462+03
(1 row)

mboguk=# select '2021-04-10 17:23:33.043462+03'::timestamptz::date;
    date    
------------
 2021-04-10
(1 row)

mboguk=# set timezone to 'Australia/Melbourne';
SET
mboguk=# select '2021-04-10 17:23:33.043462+03'::timestamptz::date;
    date    
------------
 2021-04-11
(1 row)


См на то что ::date дает разный результат на одном входе при разных настройках timezone.

По научному - приведение timestamptz к date - не immutable и как любая не immutable функция в условии не может быть проброшена на удаленную сторону fdw.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
use index foreign table
    #40061372
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Огромное спасибо! Все понял.
...
Рейтинг: 0 / 0
use index foreign table
    #40061444
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk,

Максим, не подскажете еще

Есть таблица с индексом по полю n_id_form_version int4 NOT NULL

select * from ft_frm where n_id_form_version = 20577291

Запрос на самом сервере
Index Scan using ft_frm_form_id on ft_frm fd (cost=0.71..14918.00 rows=613688 width=78) (actual time=0.076..8.722 rows=35679 loops=1)
Output: n_id, n_id_form_version, n_id_left_header, n_id_top_header, n_val, s_val, d_val, n_err, id_row, n_id_new
Index Cond: (fd.n_id_form_version = 20577291)
Planning time: 19.210 ms
Execution time: 9.983 ms


Запрос через fdw
Foreign Scan on ft_frm fd (cost=100.71..27291.76 rows=613688 width=78) (actual time=1.478..160.303 rows=35679 loops=1)
Output: n_id, n_id_form_version, n_id_left_header, n_id_top_header, n_val, s_val, d_val, n_err, id_row, n_id_new
Remote SQL: SELECT n_id, n_id_form_version, n_id_left_header, n_id_top_header, n_val, s_val, d_val, n_err, id_row, n_id_new FROM ft_frm WHERE ((n_id_form_version = 20577291))
Planning Time: 44.055 ms
Execution Time: 161.871 ms


Очевидно индекс используется в обоих случаях, иначе бы запрос просто умер, там сотни млн записей, но разница во времени выполнения конечно астрономическая.
...
Рейтинг: 0 / 0
use index foreign table
    #40061452
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff,

1)сравните время выполнения на простом запросе select 1 локально и через fdw

2)измерьте сетевую задержку между этими двумя серверами с базами

3)сделайте на стороне сервера источника тестовую базу и с нее fdw на тут таблицу что тестируете... и посмотрите на времена выполнения там - это даст вам результат максимально чистый от скорости сети между 2мя серверами

4)посмотрите на размер ответа от того запроса что вы запускали (например через \copy в файл его)
и измерьте за какое время он (файл) у вас между серверами передается через тот же scp или rsync

дальше если все еще будет не понятно - пришлите все эти результаты сюда... вдруг у вас действительно нетипичная проблема (КРАЙНЕ СОМНИТЕЛЬНО на самом деле).

PS: форум все таки не служба поддержки продукта )).

PPS: разница меньше 10 раз... никто не обещал что FDW бесплатный тем более при передаче по сети... так что это не астрономическая.
Но причины вполне можно изучить и часто ускорить до разницы не более чем в пару раз.

--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
use index foreign table
    #40061556
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, Большое спасибо за ответ.

Я не пытаюсь сделать, чтоб мне все разжевали и на тарелку положили, просто не всегда можно предположить, что ответ потребует много временных затрат. В данном случае думал будет в духе "смотри в сторону .." или "для fdw это нормально".
Конечно развернутые ответы это круто, огромное спасибо.
...
Рейтинг: 0 / 0
use index foreign table
    #40061557
kliff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Boguk, продолжу исследовать тему, хотелось бы в итоге сделать для себя более менее однозначные выводы.
Вообще надо 5ТБ данных переложить из одной БД в другую БД с абсолютно другой схемой данных на другом сервере и может оказаться, что fdw вообще плохой вариант для этих целей.
...
Рейтинг: 0 / 0
use index foreign table
    #40061622
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kliff
Maxim Boguk, Большое спасибо за ответ.

Я не пытаюсь сделать, чтоб мне все разжевали и на тарелку положили, просто не всегда можно предположить, что ответ потребует много временных затрат. В данном случае думал будет в духе "смотри в сторону .." или "для fdw это нормально".
Конечно развернутые ответы это круто, огромное спасибо.


С любыми проблемами не бывает однозначных ответов... всегда есть десяток возможных причин почему так и почему не так...
И сразу сказать в чем проблема или все нормально или нет - нельзя.

С той же c_date>current_date все легко решается указанием вместо даты полного timestamptz чтобы не было приведений типов
и было понятно в какой именно timezone сравниваем типа c_date>'2021-04-12 00:00:00+03'::timestamptz


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / use index foreign table
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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