У меня есть несколько видов конфликтов:
Сначала я создаю несколько базовых видов для фильтров нижнего уровня
CREATE OR REPLACE VIEW view1 AS
SELECT * FROM table1 WHERE conditions
CREATE OR REPLACE VIEW view2 AS
SELECT * FROM table2 WHERE conditions
...
Затем я присоединяюсь к ним соответственно.Отношение соединения выглядит как одна таблица ко многим таблицам, поэтому я создаю одно представление для каждого соединения таблица-таблица.
CREATE OR REPLACE VIEW join1_view1 AS
SELECT * FROM view1 JOIN view2 ON view1.entity_type = 'View2' AND view1.entity_id = view2.id WHERE conditions
CREATE OR REPLACE VIEW join1_view2 AS
SELECT * FROM view1 JOIN view3 ON view1.entity_type = 'View3' AND view1.entity_id = view3.id WHERE conditions
CREATE OR REPLACE VIEW join2_view1 AS
SELECT * FROM view1 JOIN view4 ON view1.assigned_type = 'View4' AND view1.assigned_id = view4.id WHERE conditions
CREATE OR REPLACE VIEW join2_view2 AS
SELECT * FROM view1 JOIN view5 ON view1.assigned_type = 'View5' AND view1.assigned_id = view5.id WHERE conditions
...
Затем я использую их для объединения.
CREATE OR REPLACE VIEW union1 AS
SELECT * FROM join1_view1
UNION
SELECT * FROM join1_view2
CREATE OR REPLACE VIEW union2 AS
SELECT * FROM join2_view1
UNION
SELECT * FROM join2_view2
Этовсе хорошо на данный момент.Но на следующем шаге я присоединюсь к этим двум представлениям объединения.
CREATE OR REPLACE VIEW join_union AS
SELECT * FRON union1 INNER JOIN union2 ON union1.id = union2.id
Затем я обнаружил, что если я установлю другие ограничения, время запроса будет немного другим.
Без ограничений:
SELECT * FROM join_union
занимает 4 секунды.Предел 100:
SELECT * FROM join_union LIMIT 100
занимает 5 секунд.Лимит 500 занимает 10 секунд.LIMIT 1000 занимает 16 секунд.
Это не закончено.После 1000 удивленный LIMIT 2000 занимает 1 секунду.ПРЕДЕЛ 100 000 (фактически он имеет 20 000 записей) занимает 3 секунды.
Кривая выглядит следующим образом:
И Максимальное время произошло в LIMIT 1325
Я выполнил EXPLAIN (АНАЛИЗ, БУФЕРЫ) в этих случаях, и я получаю следующие планы:
SELECT * FROM join_union noпредел.
SELECT * FROM join_union LIMIT 1000
SELECT * FROM join_union LIMIT 10000