2012-04-06 19 views
21

我正在使用MSSQL Server 2008 R2,并试图优化我的视图,当我偶然发现索引视图。不幸的是,我的大多数视图都使用了索引视图不支持的左外连接。经过一番研究之后,我很困惑这是最好的方法。我有以下选择:索引视图和左连接一劳永逸

1)将左连接转换为内连接,使用“OR(IsNull(a)AND IsNull(b))”模拟左连接。

我在几个地方找到了这个解决方案,但是提到了性能损失。

2)转换左连接到内部连接,并用空的GUID(00000000-0000-0000-0000-000000000000更换空列的空值)和右表中的一个匹配的GUID添加一行。

这看起来是最明显的性能明智的,但它似乎浪费空间的每一行,否则将空。

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) 

现在,做下面的查询率“不能创建视图索引”测试.dbo.v_Tags“因为它采用了左,右,或全外连接,并且没有外连接被允许在索引视图中可以考虑使用一个内部联接,而不是”:

CREATE UNIQUE CLUSTERED INDEX [TagId] ON [dbo].[v_Tags] 
(
[TagId] ASC 
) 
GO 

这是预期的行为,但是您会推荐什么行动方案以从我的方案中获得最佳性能?这里带回家是最好的表现。

+1

那你结束了这个干什么受益?我正面临一个类似的问题,试图索引一些观点。 – user1948635 2014-01-31 13:44:40

+0

面对类似的情况,非规范化表格(带有触发器或其他一些保持最新的方式)也可能成为列表中的一个选项。 – 2014-10-01 11:34:18

+0

我回答了关于实现左连接索引的非常类似的问题。虽然没有直接的方法来做到这一点......这里是选项#5 http://stackoverflow.com/a/31171129/1902664 – cocogorilla 2016-04-20 23:01:39

回答

6

你为什么将你的视图编入索引?您在解决方案2中提到了“浪费空间”,但是您是否知道当您为视图编制索引时,将其坚持在数据库上?

换句话说,您制作了视图在数据库上返回的数据的副本,并且每次在源表上更新数据时,SQL Server的一些内部机制必须在创建的新数据结构上更新它因为现在SQL服务器从视图中读取,而不是表格了。

如果使用Profiler + DTA甚至DMVS你能拿出正确的索引要在你的表创建的任何视图将从

+1

如果视图呈现几乎不变的数据(很少在底层表中更改),并且是也用在很多地方?在这种情况下,索引视图有助于提高性能 – Thetam 2012-09-10 14:02:06

+0

,是的。你是对的 – Diego 2012-09-11 08:49:04

+2

如果你想创建一个全文索引,你还必须索引你的视图。 – 2014-08-06 08:03:48

相关问题