索引未应​​用于索引视图

Posted

技术标签:

【中文标题】索引未应​​用于索引视图【英文标题】:Index is not getting applied on Indexed View 【发布时间】:2012-01-31 18:37:30 【问题描述】:

我有一个索引视图,但是当我对该视图运行查询时,未应用基于视图构建的索引,并且查询在没有索引的情况下运行。下面是我的虚拟脚本: 表格+视图+视图索引

CREATE TABLE P_Test
  (
     [PID]      INT IDENTITY,
     [TID]      INT,
     [StatusID] INT
  )

CREATE TABLE T_Test
  (
     [TID] INT IDENTITY,
     [FID] INT,
  )

CREATE TABLE F_Test
  (
     [FID]      INT IDENTITY,
     [StatusID] INT
  )

GO

INSERT INTO F_Test
SELECT TOP 1000 ABS(CAST(NEWID() AS BINARY(6)) %10) --below 100
FROM   master..spt_values

INSERT INTO T_Test
SELECT TOP 10000 ABS(CAST(NEWID() AS BINARY(6)) %1000) --below 1000
FROM   master..spt_values,
       master..spt_values v2

INSERT INTO P_Test
SELECT TOP 100000 ABS(CAST(NEWID() AS BINARY(6)) %10000) --below 10000
                  ,
                  ABS(CAST(NEWID() AS BINARY(6)) %10)--below 10
FROM   master..spt_values,
       master..spt_values v2

GO

CREATE VIEW [TestView]
WITH SCHEMABINDING
AS
  SELECT P.StatusID AS PStatusID,
         F.StatusID AS FStatusID,
         P.PID
  FROM   dbo.P_Test P
         INNER JOIN dbo.T_Test T
           ON T.TID = P.TID
         INNER JOIN dbo.F_Test F
           ON T.FID = F.FID

GO

CREATE UNIQUE CLUSTERED INDEX [PK_TestView]
  ON [dbo].[TestView] ( [PStatusID] ASC, [FStatusID] ASC, [PID] ASC )
  WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

GO 

现在,当我运行以下查询时,未应用 [PK_TestView] 索引:

    SELECT PStatusID ,
        FStatusID ,
        PID  FROM [TestView] 

SELECT PStatusID ,
        FStatusID ,
        PID  FROM [TestView] 
WHERE [PStatusID]=1

SELECT COUNT(PStatusID) FROM [TestView] 
WHERE [PStatusID]=1

你能帮我解决这个问题吗?

【问题讨论】:

也许优化器只是确定索引对您的查询没有用处? @fge - 不,不是这样。 OP 在PStatusID 上没有有用的索引,或者以其他方式进行连接,因此索引视图要便宜得多。 【参考方案1】:

您需要使用NOEXPAND 提示。除非您在 Enterprise Edition 引擎上,否则 SQL Server 不会考虑匹配没有此索引的视图(即使查询中引用了视图名称)。

SELECT COUNT(PStatusID) 
FROM [TestView] 
     WITH (NOEXPAND) -- this line
WHERE [PStatusID]=1

这应该会给你第一个便宜得多的计划

【讨论】:

是的,它起作用了!,只是好奇,使用 NOEXPAND 有什么负面影响吗? @RockySingh - 只是这意味着 SQL Server 不能考虑使用视图。

以上是关于索引未应​​用于索引视图的主要内容,如果未能解决你的问题,请参考以下文章

mysql基础 索引和视图

iphone索引表视图问题

SqlServer2008R2索引视图

索引视图SQL优化以及数据库存储过程

mysql数据库索引和视图,触发器

SQL 索引视图:如果数据发生变化会发生啥