извиняюсь, вижу RFI.FeedID, но ... тебе DE уже сказал.
Прикол там действительно не во вьюхе. Я могу написать запрос с таблицей,
аналогичный тому что с вьюхой:
SELECT I.*
FROM "RssFeedItems" I
LEFT JOIN (SELECT MIN(RDB$DB_KEY) AS ENCLOSURE_KEY, "FeedItemId" FROM
"RssFeedItemEnclosures" GROUP BY "FeedItemId")
AS EN ON EN."FeedItemId" = I."Id"
LEFT JOIN "RssFeedItemEnclosures" E ON E.RDB$DB_KEY = EN.ENCLOSURE_KEY
JOIN "RssCacheElements" RCE ON I."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540
Если же поставить INNER JOIN до LEFT, то всё начинает летать.
1) Хреновый план с внешним соединением впереди:
PLAN JOIN (JOIN (JOIN (I NATURAL, EN RssFeedItemEnclosures ORDER
FK_RssFeedItemEnclosures_1 INDEX (FK_RssFeedItemEnclosures_1)), E INDEX ()),
RCE INDEX (FK_RssCacheElements_1, FK_RSSCACHEELEMENTS_0))
2) Хороший спал с внутренним соединением впереди
PLAN JOIN (JOIN (JOIN (RCE INDEX (FK_RSSCACHEELEMENTS_0), I INDEX
(RssFeedItems_IDX2)), EN RssFeedItemEnclosures ORDER FK_RssFeedItemEnclosures_1
INDEX (FK_RssFeedItemEnclosures_1)), E INDEX ())
Этот аспект я не очень понимаю. Я ожидал что от перемены мест джойнов план не
должен изменится. Возможно ошибался...
---------------------------------------------------------------------------
Теперь вернёмся к запросу с представлением.
1) Этот запрос выполняется 9s 360ms:
SELECT I.*
FROM "UndeletableRssFeedItems" I
JOIN "RssCacheElements" RCE
ON I."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540
PLAN JOIN (JOIN (JOIN (I I NATURAL, I EN RssFeedItemEnclosures ORDER
FK_RssFeedItemEnclosures_1 INDEX (FK_RssFeedItemEnclosures_1)), I E INDEX ()),
RCE INDEX (FK_RssCacheElements_1, FK_RSSCACHEELEMENTS_0))
2) Если же таблицу и представление поменять местами, то запрос выполняется 3m
13s 31ms:
SELECT I.*
FROM "RssCacheElements" RCE
JOIN "UndeletableRssFeedItems" I
ON I."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540
PLAN JOIN (JOIN (JOIN (I I NATURAL, I EN RssFeedItemEnclosures ORDER
FK_RssFeedItemEnclosures_1 INDEX (FK_RssFeedItemEnclosures_1)), I E NATURAL),
RCE INDEX (FK_RssCacheElements_1, FK_RSSCACHEELEMENTS_0))
Тут I E NATURAL нарисовался почему-то уже... Очень нехорошо :-(