Почему вид удивил временной кривой с лимитом? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть несколько видов конфликтов:

Сначала я создаю несколько базовых видов для фильтров нижнего уровня

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 секунды.

Кривая выглядит следующим образом:

enter image description here

И Максимальное время произошло в LIMIT 1325

Я выполнил EXPLAIN (АНАЛИЗ, БУФЕРЫ) в этих случаях, и я получаю следующие планы:

SELECT * FROM join_union noпредел.

SELECT * FROM join_union LIMIT 1000

SELECT * FROM join_union LIMIT 10000

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...