我正在使用 MSSQL Server 2008 R2,当我偶然发现索引视图时,我正在尝试优化我的视图。不幸的是,我的大多数视图都使用了索引视图不支持的左外连接。经过大量研究,我对解决此问题的最佳方法感到困惑。在我看来,我有以下选择:
1)使用“OR (IsNull(a) AND IsNull(b))”模拟左连接的技巧将左连接转换为内连接
我在几个地方找到了这个解决方案,但提到了性能损失。
2)将左连接转换为内连接,并将可空列的空值替换为空 guid (00000000-0000-0000-0000-0000000000000),并在右表中添加具有匹配 guid 的单行。
这在性能方面似乎是最明显的,但对于否则为 NULL 的每一行来说,这似乎是浪费空间。
3)把我的观点分成两个观点。第一个视图是我可索引的大部分逻辑。第二个视图派生自第一个视图并添加左连接。
这里的想法是,通过索引的基本视图可能会提高性能。并且即使查询派生视图也会获得至少一些性能优势。
4)不要索引我的观点
是否会以比上述任何选项更高效的方式离开视图?
5)我没想到的想法
我编写了我的基本场景如下:
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)
现在,执行以下查询会产生“无法在视图“Test.dbo.v_Tags”上创建索引,因为它使用 LEFT、RIGHT 或 FULL OUTER 连接,并且索引视图中不允许有 OUTER 连接。请考虑使用 INNER 连接。 “:
CREATE UNIQUE CLUSTERED INDEX [TagId] ON [dbo].[v_Tags]
(
[TagId] ASC
)
GO
这是预期的行为,但是您会建议采取什么行动来从我的方案中获得最佳性能?这里的重点是最佳性能。