Exibições Indexadas e Junções Esquerdas de uma vez por todas

Estou usando o MSSQL Server 2008 R2 e estou tentando otimizar meus modos de exibição quando me deparei com exibições indexadas. Infelizmente a maioria dos meus modos de exibição usa uma junção externa à esquerda que não é suportada com exibições indexadas. Depois de um monte de pesquisas, fiquei confusa a melhor maneira de fazer isso. Do jeito que eu vejo, eu tenho as seguintes opções:

1) Converta as junções esquerdas em junções internas usando o truque para simular uma junção esquerda com "OR (IsNull (a) AND IsNull (b))"

Eu encontrei esta solução em alguns lugares, mas houve menção de uma perda de desempenho.

2) Converta as junções esquerdas em junções internas e substitua os nulos da coluna anulável por guias vazios (00000000-0000-0000-0000-000000000000) e inclua uma única linha na tabela à direita com um guia correspondente.

Isso parece ser o desempenho mais óbvio, mas parece um desperdício de espaço para cada linha que, de outra forma, seria NULL.

3) Quebre minha visão em duas visões. A primeira vista é a maioria da minha lógica que é indexável. E a segunda vista deriva da primeira vista e adiciona as junções da esquerda.

A idéia aqui é, pode haver um ganho de desempenho através da visão base sendo indexada. E que mesmo a consulta da visão derivada ganharia pelo menos parte do benefício de desempenho.

4) Não indexe minhas visualizações

Deixando a visão do jeito que ela tem mais performance que qualquer uma das opções acima?

5) A ideia que eu não pensei

Eu escrevi meu cenário básico da seguinte forma:

<code>   CREATE TABLE [dbo].[tbl_Thumbnails](
        [ThumbnailId] [uniqueidentifier] NOT NULL,
        [Data] [image] NULL,
        [Width] [smallint] NOT NULL,
        [Height] [smallint] NOT NULL
     CONSTRAINT [PK_tbl_Thumbnails] PRIMARY KEY CLUSTERED 
    (
        [ThumbnailId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

    GO

    CREATE TABLE [dbo].[tbl_Tags](
        [TagId] [uniqueidentifier] NOT NULL,
        [ThumbnailId] [uniqueidentifier] NULL
     CONSTRAINT [PK_tbl_Tags] PRIMARY KEY CLUSTERED 
    (
        [TagId] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO

    CREATE VIEW [dbo].[v_Tags] WITH SCHEMABINDING AS
    SELECT     dbo.tbl_Tags.TagId, dbo.tbl_Tags.ThumbnailId
    FROM         dbo.tbl_Tags LEFT OUTER JOIN
                          dbo.tbl_Thumbnails
    ON     dbo.tbl_Tags.ThumbnailId = dbo.tbl_Thumbnails.ThumbnailId

    GO

    INSERT INTO tbl_Tags VALUES ('16b23bb8-bf17-4784-b80a-220da1163584', NULL)
    INSERT INTO tbl_Tags VALUES ('e8b50f03-65a9-4d1e-b3b4-268f01645c4e', 'a45e357b-ca9c-449a-aa27-834614eb3f6e')
    INSERT INTO tbl_Thumbnails VALUES ('a45e357b-ca9c-449a-aa27-834614eb3f6e', NULL, 150, 150)
</code>

Agora, a seguinte consulta gera "Não é possível criar índice na exibição" Test.dbo.v_Tags "porque ele usa uma junção LEFT, RIGHT ou FULL OUTER e nenhuma junção OUTER é permitida em exibições indexadas. Considere o uso de uma junção INNER. ":

<code>CREATE UNIQUE CLUSTERED INDEX [TagId] ON [dbo].[v_Tags] 
(
[TagId] ASC
)
GO 
</code>

Esse é o comportamento esperado, mas qual ação você recomendaria para obter o melhor desempenho do meu cenário? O ponto de partida aqui é o melhor desempenho.

questionAnswers(1)

yourAnswerToTheQuestion