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

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

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

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

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

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

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

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

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

По документации вроде должно работать. Покажите `EXPLAIN (analyze, verbose)` (тут `verbose` важен) запроса.
...
Рейтинг: 0 / 0
17.03.2016, 14:09
    #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
17.03.2016, 14:20
    #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
17.03.2016, 15:20
    #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
17.03.2016, 15:21
    #39194500
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс на внешнюю таблицу
Теперь постоянно надо обращать на это внимание.
Или перейти на dblink?
...
Рейтинг: 0 / 0
17.03.2016, 15:26
    #39194510
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Индекс на внешнюю таблицу
big-trot,

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

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

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


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