程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了一劳永逸的索引视图和左联接大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决一劳永逸的索引视图和左联接?

开发过程中遇到一劳永逸的索引视图和左联接的问题如何解决?下面主要结合日常开发的经验,给出你关于一劳永逸的索引视图和左联接的解决方法建议,希望对你解决一劳永逸的索引视图和左联接有所启发或帮助;

为什么要索引您的视图?您在解决方案2中提到了“空间浪费”,但是您是否知道在索引视图时将其持久保存在数据库中?

换句话说,您需要复制视图将在数据库上返回的数据的副本,并且每次在源表上更新数据时,sql Server的某些内部机制都必须在创建的这个新数据结构上对其进行更新,因为现在sql Server从视图中读取,不再从表中读取。

如果您使用Profiler +DTA甚至DMVS,则可以在表上提供要创建的正确索引,任何视图都将从中受益

解决方法

我正在使用MSSQL Server 2008
R2,当我偶然发现索引视图时,我正在尝试优化视图。不幸的是,我的大多数视图都使用左外部联接,而索引视图不支持这种联接。经过一堆研究,让我感到困惑的是最好的解决方法。我看到的方式有以下几种选择:

1) 使用技巧将左联接转换为内部联接,以使用“ OR(IsNull(a)AND IsNull(b))”模拟左联接

我在几个地方找到了该解决方案,但是提到了性能下降。

2)
将左联接转换为内联接,并用空的GUID(00000000-0000-0000-0000-0000-000000000000)替换可为空的列的空值,并在右表中添加一个具有匹配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,ALLOW_PAGE_LOCKS  = ON) ON [PRIMary]
    ) ON [PRIMary]

    GO

    create view [dbo].[v_Tags] WITH scheR_518_11845@ABINDING 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

这是预期的行为,但是您建议采取什么措施才能从我的方案中获得最佳性能?这里带回家的地方是最好的性能。

大佬总结

以上是大佬教程为你收集整理的一劳永逸的索引视图和左联接全部内容,希望文章能够帮你解决一劳永逸的索引视图和左联接所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。