У меня тут есть пример, в котором оптимизатор не использует индекс для 
злополучной вьюхи:

Вьюха:

CREATE VIEW "UndeletableRssFeedItems"(
   "Id",
   "FeedId",
   "Title",
   "Link",
   "Description",
   "Author",
   "Comments",
   "Guid",
   "PubDate",
   "SourceUrl",
   "SourceValue",
   "Hash",
   "Deprecated",
   "Hidden",
   "EnclosureUrl",
   "EnclosureLength",
   "EnclosureType")
AS
SELECT
 I."Id",
 I."FeedId",
 I."Title",
 I."Link",
 I."Description",
 I."Author",
 I."Comments",
 I."Guid",
 I."PubDate",
 I."SourceUrl",
 I."SourceValue",
 I."Hash",
 I."Deprecated",
 I."Hidden",
 COALESCE(E."Url", ''),
 COALESCE(E."Length", 0),
 COALESCE(E."Type", '')
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;


2) Тормозящий запрос (по таблице RssFeedItems, которая внутри вьюхи, идёт 
натуральный скан):

SELECT RFI."Id", RFI."FeedId", RFI."Title", RFI."Link", RFI."Description", 
RFI."Author",
 RFI."Comments", RFI."Guid", RFI."PubDate", RFI."SourceUrl", RFI."SourceValue",
 RFI."Hash", RCE."Type"
FROM "UndeletableRssFeedItems" RFI
JOIN "RssCacheElements" RCE ON RFI."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540

PLAN JOIN (JOIN (JOIN (RFI I NATURAL, RFI EN RssFeedItemEnclosures ORDER 
FK_RssFeedItemEnclosures_1 INDEX (FK_RssFeedItemEnclosures_1)), RFI E INDEX 
()), RCE INDEX (FK_RssCacheElements_1, FK_RSSCACHEELEMENTS_0))


3) Запрос с таблицей вместо представления быстрый:

SELECT RFI."Id", RFI."FeedId", RFI."Title", RFI."Link", RFI."Description", 
RFI."Author",
 RFI."Comments", RFI."Guid", RFI."PubDate", RFI."SourceUrl", RFI."SourceValue",
 RFI."Hash", RCE."Type"
FROM "RssFeedItems" RFI
JOIN "RssCacheElements" RCE ON RFI."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540

PLAN JOIN (RCE INDEX (FK_RSSCACHEELEMENTS_0), RFI INDEX (RssFeedItems_IDX2))


4) Простой запрос, на котором для вьюхи оптимизатор использует индекс по 
"FeedId"

SELECT RFI."Id", RFI."FeedId", RFI."Title", RFI."Link", RFI."Description", 
RFI."Author",
 RFI."Comments", RFI."Guid", RFI."PubDate", RFI."SourceUrl", RFI."SourceValue",
 RFI."EnclosureUrl", RFI."EnclosureLength", RFI."EnclosureType"
FROM "UndeletableRssFeedItems" RFI
WHERE RFI."FeedId" = 743

PLAN JOIN (JOIN (RFI I INDEX (RssFeedItems_IDX2), RFI EN RssFeedItemEnclosures 
ORDER FK_RssFeedItemEnclosures_1 INDEX (FK_RssFeedItemEnclosures_1)), RFI E 
INDEX ())


5) Переделанный запрос (2), который летает:

SELECT RFI."Id", RFI."FeedId", RFI."Title", RFI."Link", RFI."Description", 
RFI."Author",
 RFI."Comments", RFI."Guid", RFI."PubDate", RFI."SourceUrl", RFI."SourceValue",
 RFI."Hash", RCE."Type"
FROM "UndeletableRssFeedItems" RFI
RIGHT JOIN "RssCacheElements" RCE ON RFI."FeedId" = RCE."RssFeedId"
WHERE RCE."FeedDefinitionId" = 1540 AND RFI."Id" IS NOT NULL

PLAN JOIN (RCE INDEX (FK_RSSCACHEELEMENTS_0), JOIN (JOIN (RFI I INDEX 
(RssFeedItems_IDX2), RFI EN RssFeedItemEnclosures ORDER 
FK_RssFeedItemEnclosures_1 INDEX (FK_RssFeedItemEnclosures_1)), RFI E INDEX ()))


Если интересно, могу выслать тестовую базу.

Ответить