Indizierte Views und Left Joins ein für alle Mal

Ich verwende MSSQL Server 2008 R2 und versuche, meine Ansichten zu optimieren, wenn ich auf indizierte Ansichten stoße. Leider verwenden die meisten meiner Ansichten Linksaußen-Joins, die von indizierten Ansichten nicht unterstützt werden. Nach ein paar Nachforschungen bin ich verwirrt, wie ich das am besten anstellen kann. So wie ich es sehe, habe ich folgende Möglichkeiten:

1) Konvertieren Sie die linken Verknüpfungen in innere Verknüpfungen mit dem Trick, um eine linke Verknüpfung mit "OR (IsNull (a) AND IsNull (b))" zu simulieren.

Ich habe diese Lösung an einigen Stellen gefunden, aber es wurde ein Leistungsverlust erwähnt.

2) Konvertieren Sie die linken Joins in innere Joins, und ersetzen Sie die Nullen der nullbaren Spalte durch leere Guids (00000000-0000-0000-0000-000000000000). Fügen Sie in der rechten Tabelle eine einzelne Zeile mit einer passenden Guid hinzu.

Dies scheint in Bezug auf die Leistung am offensichtlichsten zu sein, aber es scheint eine Verschwendung von Platz für jede Zeile zu sein, die sonst NULL wäre.

3) Teilen Sie meine Ansicht in zwei Ansichten auf. Die erste Ansicht ist die Mehrheit meiner Logik, die indizierbar ist. Die zweite Ansicht leitet sich von der ersten Ansicht ab und fügt die linken Verknüpfungen hinzu.

Die Idee dabei ist, dass es möglicherweise einen Leistungsgewinn durch die Indexierung der Basisansicht gibt. Und selbst das Abfragen der abgeleiteten Ansicht würde zumindest einen Teil des Leistungsvorteils bringen.

4) Indiziere meine Ansichten nicht

Wenn Sie die Ansicht so lassen, wie sie performanter ist als alle oben genannten Optionen?

5) Die Idee, an die ich nicht gedacht habe

Ich habe mein Basisszenario folgendermaßen geschrieben:

<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>

Wenn Sie nun die folgende Abfrage ausführen, erhalten Sie folgende Ergebnisse: "Der Index für die Sicht" Test.dbo.v_Tags "kann nicht erstellt werden, da die Verknüpfung LINKS, RECHTS oder VOLL OUTER verwendet wird und in indizierten Ansichten keine OUTER-Verknüpfungen zulässig sind. Verwenden Sie stattdessen eine INNER-Verknüpfung. ":

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

Dies ist das erwartete Verhalten, aber welche Vorgehensweise würden Sie empfehlen, um die beste Leistung aus meinem Szenario zu erzielen? Der Take-Home-Punkt ist hier die beste Leistung.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage