Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
Ребята, подскажите, не нашел в доках. Ситуация такая
есть таблица 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

Где можно про это почитать подскажите пожалуйста!
9 апр 21, 14:26    [22306474]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1285
kliff,

where c_date > date 'now'

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

Вопрос не в индексе, а в том, какой запрос отправляет fdw. В explain (verbose) это будет видно
9 апр 21, 14:47    [22306503]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
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
9 апр 21, 17:42    [22306637]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
kliff,

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


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
9 апр 21, 18:03    [22306657]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1285
kliff
Melkij,

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

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

Повторю: посмотрите какой запрос отправляет fdw.
9 апр 21, 18:09    [22306660]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
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
9 апр 21, 19:08    [22306691]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
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 а где это посмотреть?
9 апр 21, 19:12    [22306693]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
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
9 апр 21, 19:14    [22306698]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Melkij
Member

Откуда: Санкт-Петербург
Сообщений: 1285
kliff
--какой запрос отправляет fdw
fdw а где это посмотреть?

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

И какая версия базы, где стоит fdw? И postgres_fdw ли это вообще или какой-то из generic fdw?
9 апр 21, 21:59    [22306777]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
Melkij,

да, стоит postgres_fdw. Версия PG 12.5
10 апр 21, 08:09    [22306886]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
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)да
10 апр 21, 08:42    [22306887]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
kliff
Maxim Boguk,

2)timestamptz NOT NULL,


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

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


Пример
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

Сообщение было отредактировано: 10 апр 21, 18:11
10 апр 21, 17:29    [22307019]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
Maxim Boguk,

Огромное спасибо! Все понял.
10 апр 21, 19:46    [22307061]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
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


Очевидно индекс используется в обоих случаях, иначе бы запрос просто умер, там сотни млн записей, но разница во времени выполнения конечно астрономическая.
11 апр 21, 13:49    [22307229]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
kliff,

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

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

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

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

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

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

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

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

Сообщение было отредактировано: 11 апр 21, 15:41
11 апр 21, 15:05    [22307243]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
Maxim Boguk, Большое спасибо за ответ.

Я не пытаюсь сделать, чтоб мне все разжевали и на тарелку положили, просто не всегда можно предположить, что ответ потребует много временных затрат. В данном случае думал будет в духе "смотри в сторону .." или "для fdw это нормально".
Конечно развернутые ответы это круто, огромное спасибо.
12 апр 21, 07:19    [22307400]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
kliff
Member

Откуда:
Сообщений: 363
Maxim Boguk, продолжу исследовать тему, хотелось бы в итоге сделать для себя более менее однозначные выводы.
Вообще надо 5ТБ данных переложить из одной БД в другую БД с абсолютно другой схемой данных на другом сервере и может оказаться, что fdw вообще плохой вариант для этих целей.

Сообщение было отредактировано: 12 апр 21, 07:16
12 апр 21, 07:21    [22307401]     Ответить | Цитировать Сообщить модератору
 Re: use index foreign table  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4719
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
12 апр 21, 10:52    [22307501]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить