2012-01-02 14 views
4

インデックス付きビューがありますが、そのビューでクエリを実行すると、ビューに作成されたインデックスは適用されず、クエリはインデックスなしで実行されます。以下は私のダミーのスクリプトです:ビューの テーブル+ビュー+インデックスは、私は[PK_TestView]インデックスが適用されていない、次のクエリを実行するとインデックスがインデックス付きビューに適用されません。

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 

は今:

SELECT PStatusID , 
     FStatusID , 
     PID FROM [TestView] 

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

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

あなたは私がこれを固定助けることができます?

+2

はたぶん、オプティマイザはちょうどインデックスがクエリのために役に立たないと判断しましたか? – fge

+0

@fge - そうではありません。 OPは 'PStatusID'に有用なインデックスを持たないか、そうでなければジョインを行うため、インデックス付きビューははるかに安いです。 –

答えて

4

NOEXPANDヒントを使用する必要があります。 SQL Serverは、エンタープライズ版エンジンを使用していない限り、ビュー名が照会で参照されていても、これを除いたインデックス付きビューの照合は考慮しません。

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

これはあなたの最初を与える必要があり、はるかに安く、計画

Plan

+0

はい、それは働いた!、ちょうど好奇心が強い、NOEXPANDを使用するの否定的な側面はありますか? –

+2

@RockySingh - SQL Serverはビューを使用していない**と考えることはできません。 –

関連する問題