我正在使用MSSQL Server 2008 R2,当我偶然发现索引视图时,我正在尝试优化我的视图.不幸的是,我的大多数视图都使用了索引视图不支持的左外连接.经过一系列的研究,我感到很困惑,最好的办法是解决这个问题.我看到它的方式,我有以下选择:
1)使用技巧将左连接转换为内连接,以使用"OR(IsNull(a)AND IsNull(b))"模拟左连接
我在几个地方找到了这个解决方案,但提到了性能损失.
2)将左连接转换为内连接,并用空guid(00000000-0000-0000-0000-000000000000)替换可空列的空值,并在右表中添加一个匹配guid的行.
这似乎是性能最明显的,但是对于每一行都是空的浪费似乎是空的.
3)将我的观点分为两种观点.第一个视图是我的大部分逻辑,即Indexable.第二个视图派生自第一个视图并添加左连接.
这里的想法是,通过索引的基本视图可能会有性能提升.甚至查询派生的视图至少会获得一些性能优势.
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 …Run Code Online (Sandbox Code Playgroud) 为一篇冗长的帖子道歉,但我需要发布一些代码来说明问题.
灵感来自问题*什么是不使用选择的原因?,我决定指出一些我之前注意到的select*行为的观察结果.
让我们的代码说明一切:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[starTest]') AND type in (N'U'))
DROP TABLE [dbo].[starTest]
CREATE TABLE [dbo].[starTest](
[id] [int] IDENTITY(1,1) NOT NULL,
[A] [varchar](50) NULL,
[B] [varchar](50) NULL,
[C] [varchar](50) NULL
) ON [PRIMARY]
GO
insert into dbo.starTest(a,b,c)
select 'a1','b1','c1'
union all select 'a2','b2','c2'
union all select 'a3','b3','c3'
go
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vStartest]'))
DROP VIEW [dbo].[vStartest]
go
create view dbo.vStartest as
select * from dbo.starTest …Run Code Online (Sandbox Code Playgroud)