Hello, Sasha!
sasha wrote:
У меня тут есть пример, в котором оптимизатор не использует индекс для
злополучной вьюхи:
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;
план I NATURAL вполне нормален.
2) Тормозящий запрос (по таблице RssFeedItems, которая внутри вьюхи,
идёт натуральный скан):
FROM "UndeletableRssFeedItems" RFI
JOIN "RssCacheElements" RCE ON RFI."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540
я в упор не вижу, где накладывается доп. условие на запрос во view,
чтобы по rssfeeditems был хоть какой то отбор по другим столбцам,
по которым есть индексы.
3) Запрос с таблицей вместо представления быстрый:
быстрый, потому что JOIN, а не LEFT JOIN, и кроме того,
запрос не соответствует суммарному view+запрос.
4) Простой запрос, на котором для вьюхи оптимизатор использует индекс по
"FeedId"
WHERE RFI."FeedId" = 743
!!! ну наконец-то.
FROM "UndeletableRssFeedItems" RFI
RIGHT JOIN "RssCacheElements" RCE ON RFI."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540 AND RFI."Id" IS NOT NULL
при чем тут right join? в любом случае, взялся индекс по rfi.feedId.
Если интересно, могу выслать тестовую базу.
не надо. посмотри лучше еще раз joins.htm и dataaccesspaths.htm.
--
Dmitri Kuzmenko, www.ibase.ru, (495) 953-13-34