Index is not getting applied on Indexed View

梦想与她 提交于 2019-12-20 01:10:25

问题


I have an indexed view but when I run queries on that view the index which is built on View is not applied and the query runs without index. Below is my dummy script: Tables + View+ Index on View

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 

Now when I run the following queries the [PK_TestView] index is not being applied:

    SELECT PStatusID ,
        FStatusID ,
        PID  FROM [TestView] 

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

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

Can you help me fixing this?


回答1:


You need to use the NOEXPAND hint. SQL Server will not consider matching indexed views without this (even if the view name is referenced in the query) unless you are on Enterprise Edition engine.

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

This should give you the first, much cheaper, plan



来源:https://stackoverflow.com/questions/8700126/index-is-not-getting-applied-on-indexed-view

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!