извиняюсь, вижу 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 нарисовался почему-то уже... Очень нехорошо :-(

Ответить