powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индекс на внешнюю таблицу
11 сообщений из 11, страница 1 из 1
Индекс на внешнюю таблицу
    #39194283
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с такой проблемой.

Имеем в БД (А) внешнюю таблицу (FOREIGN TABLE). Выполняем запрос к этой таблице в указанием условий отбора.
Запрос отрабатывает достаточно медленно. План показывает сканирование этой таблицы с последующей фильтрацией.

В другой БД (В) где реально существует таблица (на основе которой была создана внешняя таблица) тот же запрос отрабатывает мгновенно.
Сканирование идет по индексу.

Вопрос. Почему выполняется полное сканирование по внешней таблице в БД (А)? И можно ли создать индекс на внешней таблице в БД (А)?

Спасибо.
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194294
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

А какая версия СУБД? Может оно ещё не умеет предикаты во внешние таблицы пропихивать, я не помню когда это появилось, возможно только в 9.6 будет.
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194305
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

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

а для пж (на той стороне) есть несколько fdw, и кажется ни один не умеет. т.ч. если что--то надо быстро -- делайте руками seek через dblink.
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194396
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

9.3
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194405
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

По документации вроде должно работать. Покажите `EXPLAIN (analyze, verbose)` (тут `verbose` важен) запроса.
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194416
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Код: sql
1.
2.
3.
4.
5.
6.
Foreign Scan on public.planet_osm_polygon_base  (cost=100.00..134.00 rows=1 width=104) (actual time=77.905..17709.279 rows=29 loops=1)
  Output: 'Feature'::text, COALESCE(planet_osm_polygon_base."name:ru", planet_osm_polygon_base."name:en", planet_osm_polygon_base.name), '643'::text, planet_osm_polygon_base.osm_id
  Filter: (planet_osm_polygon_base.tsv_name @@ plainto_tsquery('Российская Федерация'::text))
  Rows Removed by Filter: 418808
  Remote SQL: SELECT osm_id, name, "name:ru", "name:en", tsv_name FROM public.planet_osm_polygon_base WHERE ((boundary = 'administrative'::text))
Total runtime: 17710.328 ms



qwwq,

Через dblink работает как надо.
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194428
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

В документации пишут
http://www.postgresql.org/docs/9.3/interactive/postgres-fdw.html#AEN157490 To reduce the risk of misexecution of queries, WHERE clauses are not sent to the remote server unless they use only built-in data types, operators, and functions. Operators and functions in the clauses must be IMMUTABLE as well.
Функция `plainto_tsquery(text)` стабильная и потому не пропихивается.
Оператор `@@` для текстовых аргументов также только стабильный и тоже не пропихивается.

Посмотреть:
операторы: `\do+ @@`

функции операторов: `df+ ts_match_*`

функцию приведения: `\df+ plainto_tsquery`
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194497
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Код: 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.
CREATE OR REPLACE FUNCTION pg_catalog.ts_match_qv (tsquery, tsvector)
RETURNS boolean AS
$body$ts_match_qv$body$
LANGUAGE 'internal'
IMMUTABLE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 1;

COMMENT ON FUNCTION pg_catalog.ts_match_qv(tsquery, tsvector)
IS 'implementation of @@ operator';

CREATE OR REPLACE FUNCTION pg_catalog.ts_match_tq (text,tsquery)
RETURNS boolean AS
$body$ts_match_tq$body$
LANGUAGE 'internal'
STABLE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 2;

CREATE OR REPLACE FUNCTION pg_catalog.ts_match_tt (text,text)
RETURNS boolean AS
$body$ts_match_tt$body$
LANGUAGE 'internal'
STABLE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 3;

CREATE OR REPLACE FUNCTION pg_catalog.ts_match_vq (tsvector,tsquery)
RETURNS boolean AS
$body$ts_match_vq$body$
LANGUAGE 'internal'
IMMUTABLE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 1;

CREATE OR REPLACE FUNCTION pg_catalog.plainto_tsquery (pg_catalog.regconfig,text)
RETURNS tsquery AS
$body$plainto_tsquery_byid$body$
LANGUAGE 'internal'
IMMUTABLE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 1;

CREATE OR REPLACE FUNCTION pg_catalog.plainto_tsquery (text)
RETURNS tsquery AS
$body$plainto_tsquery$body$
LANGUAGE 'internal'
STABLE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 1;



Часть стабильный, часть неизменных
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194500
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь постоянно надо обращать на это внимание.
Или перейти на dblink?
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194510
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-trot,

Не понял про "постоянно обращать внимание".

Использовать dblink проще и быстрее.

Можно сделать клон `postgres_fdw`, убрать ограничения, пересобрать и пользоваться им. Понятно, что если вы хотите багфиксы иметь в своём клоне, то нужно будет после каждого релиза сравнивать и применять их.
Это если вам FDW интерфейс удобнее.
...
Рейтинг: 0 / 0
Индекс на внешнюю таблицу
    #39194583
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Особой разницы какую использовать технологию до этой темы не было. Теперь буду ориентироваться на dblink.
Насчет "обращать внимание" я имел ввиду, что надо учитывать какая функция используется в запросе и ожидать соответствующее поведение.
Пересобирать `postgres_fdw` - этот вариант отпадает по условиям заказа.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Индекс на внешнюю таблицу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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