4

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?

4

1 に答える 1

4

NOEXPANDヒントを使用する必要があります。Enterprise Editionエンジンを使用していない限り、SQL Serverは、これがないと(ビュー名がクエリで参照されている場合でも)インデックス付きビューの一致を考慮しません。

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

これはあなたに最初の、はるかに安い計画を与えるはずです

プラン

于 2012-01-02T11:16:08.633 に答える