Postgresql 9.6 Параллельное выполнение из сторонней таблицы
Я обновил свой postgresql с 9,5 до 9,6, чтобы использовать параллельное выполнение для повышения производительности. Однако мне не удалось его использовать. В моей основной базе данных почти все мои выборки выглядят так: select * from foreign_table
Внешняя таблица - это внешняя таблица, которая находится в базе данных Oracle. Некоторые из таблиц представляют собой большие записи 10G+ и 1 000 000+, поэтому параллельный запрос должен помочь мне в этом случае.
Параметры, которые я настроил:
min_parallel_relation_size = 200MB
max_parallel_workers_per_gather = 2
max_worker_processes = 8
Когда я пытаюсь использовать команду объяснения и анализа select * из большой таблицы, размер которой составляет 1,5 ГБ, и в ней содержится 5 000 000 записей, я вижу только чужое сканирование:
Foreign Scan on customer_prod (cost=10000.00..20000.00 rows=1000
width=2438) (actual time=6.337..231408.085 rows=5770616 loops
=1)
Oracle query: ......
Planning time: 2.827 ms
Execution time: 232198.137 ms
* Я также попытался выбрать * из Foreign_table, где 1=1, но все еще тот же результат.
С другой стороны, следующий код работал:
postgres=# CREATE TABLE people_mariel_test (id int PRIMARY KEY NOT NULL, age int NOT NULL);
CREATE TABLE
postgres=# INSERT INTO people_mariel_test SELECT id, (random()*100)::integer AS age FROM generate_series(1,10000000) AS id;
INSERT 0 10000000
postgres=# explain analyze select * from people_mariel_test where age=6;
QUERY PLAN
--------------------------------------------------------------------------------
------------------------------------------------
----------
Gather (cost=1000.00..123777.76 rows=50000 width=8) (actual time=0.239..771.801 rows=99409 loops=1)
Workers Planned: 1
Workers Launched: 1
-> Parallel Seq Scan on people_mariel_test (cost=0.00..117777.76 rows=29412 width=8) (actual time=0.045..748.213 rows=49704
loops=2)
Filter: (age = 6)
Rows Removed by Filter: 4950296
Planning time: 0.261 ms
Execution time: 785.924 ms
(8 rows)
Любая идея, как я могу продолжить?
1 ответ
Из документации:
Узел ForeignScan может, при желании, поддерживать параллельное выполнение. Параллельный ForeignScan будет выполняться в нескольких процессах и должен возвращать каждую строку только один раз во всех взаимодействующих процессах. Для этого процессы могут координировать свои действия через фрагменты фиксированного размера динамической разделяемой памяти. Эта общая память не гарантируется для сопоставления по одному и тому же адресу в каждом процессе, поэтому указатели могут не использоваться. Следующие обратные вызовы вообще необязательны, но необходимы, если необходимо поддерживать параллельное выполнение.
Я искал исходный код для Oracle FDW от Laurenz Albe, и он не реализует IsForeignScanParallelSafe
и, следовательно, не может использовать параллельное выполнение.