当前位置: 首页 > 面试题库 >

一劳永逸的索引视图和左联接

秦皓君
2023-03-14
问题内容

我正在使用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, 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

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


问题答案:

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

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

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



 类似资料:
  • 我在StackOverflow上搜索了很多关于在Android环境中使用上下文的解释,但我只找到了零散的解释片段。 何时应该使用而不是?这个问题详细说明如下。 在和其他中:创建、构建、实例化...需要上下文。我们应该使用还是? 并且如果这些操作是在而不是片段中编写的? 顺便说一下,通过调用和,可能会发生空异常和/或内存泄漏:何时?更准确地说:是否只有当调用方的生存期是被调用对象生存期的(严格)子集

  • 一、视图 1.1 简介 Hive 中的视图和 RDBMS 中视图的概念一致,都是一组数据的逻辑表示,本质上就是一条 SELECT 语句的结果集。视图是纯粹的逻辑对象,没有关联的存储 (Hive 3.0.0 引入的物化视图除外),当查询引用视图时,Hive 可以将视图的定义与查询结合起来,例如将查询中的过滤器推送到视图中。 1.2 创建视图 CREATE VIEW [IF NOT EXISTS] [

  • 我正在编写一个Python脚本,它从名为“read_file”的熊猫数据帧中获取特定数据,并将其写入csv文件。为此,我循环遍历DataFrame的行,直到满足某个条件,也就是说,我将数据放入字典中,然后使用“To_csv”函数更新csv文件。当然,执行同一件事情的方法更少,也更简单,但我将把优化留到另一天(尽管我愿意接受建议)。 我想知道是否有一种方法可以提示用户决定他们想要写数据的方式。基本上

  • 问题内容: 可以说我有两个表,和。 我创建如下视图: 如果执行以下操作: 如果是index和index ,那么我们应该可以通过两个索引搜索来做到这一点。 但是,如果我可以在一个索引中对两个表建立索引,甚至对视图建立索引,那都会很好,如果源表(或)发生更改,该方法可以立即自动更新。 在Oracle中有没有办法做到这一点? 问题答案: 我不能与Oracle相提并论,但是我相信物化视图可以做到这一点。

  • 我正在尝试JPA2.1(eclipselink)中的“treat as”函数,但遇到了一个来自JPA的错误: 异常说明:ReportQuery结果大小不匹配。应为[263],但已检索到[197] 下面是我的JPQL查询(我更改了一些部分,以便更明确): 我们可以看到account和ad_account之间的左外部连接。此外,ad_account表不存在于select子句中。(idApp字段是主键的

  • 问题内容: 我目前正在使用swift和Xcode 6(测试版3)开发iOS应用。 到目前为止一切都很好,但是现在随着我的项目的发展,Xcode突然开始建立索引,并且一次又一次地建立索引,这使得Xcode几乎无法使用。 我在网上搜索了类似的问题,并尝试了解决方案,但没有一个有帮助。即使禁用索引过程()也不会使Xcode停止这样做。 索引时,我的CPU使用率高达300%+,导致风扇以最高速度运行。 在