为什么我的查询提示被忽略?

时间:2015-01-19 09:54:37

标签: sql-server sql-server-2008-r2 query-hints

我不明白为什么我不能在我的视图中使用主键作为索引。

这是主表

CREATE TABLE [dbo].[xFedDBLogMsg](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [msgType] [int] NOT NULL,
    [date] [datetime] NOT NULL,
    [delay] [time](7) NOT NULL,
    [error] [bit] NOT NULL,
    [processID] [int] NULL,
 CONSTRAINT [PK_tFedDBLogMsg] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

这是视图

CREATE VIEW [dbo].[tFedDBLogMsg]
AS
SELECT
    L.ID
    , L.msgType
    , L.[date]
    , M.MsgSent
    , M.MsgReceived
    , L.[delay]
    , L.error
    , L.processID
    , NEWID() AS INTERNALID
FROM dbo.xFedDBLogMsg AS L
LEFT JOIN FedDBMsg.dbo.tFedDBLogMsg AS M ON (
    M.ID = L.ID
)

这里的程序给了我一个警告:

ALTER PROCEDURE spGetFedDBErrorsByID (
    @pIDS AS dbo.typeNumberList READONLY
)
AS
BEGIN
        SELECT
            MSG.ID
            , MSG.msgType
            , MSG.date
            , MSG.MsgSent
            , MSG.MsgReceived
        FROM (
            SELECT
                CAST(ID.n AS INT) AS ID
            FROM @pIDS AS ID
        ) AS X
        INNER JOIN MyGolf.dbo.tFedDBLogMsg AS MSG WITH (INDEX(PK_tFedDBLogMsg)) ON (
            MSG.ID = X.ID
        )

END   
GO

Warning: Index hints supplied for view 'MyGolf.dbo.tFedDBLogMsg' will be ignored.

PS:Lorem Ipsum的段落有很多变化,但是大部分都有某些形式的改变,通过注入幽默,或者看起来不太可信的随机词。如果你打算使用一段Lorem Ipsum,你需要确保在文本中间没有隐藏任何尴尬。互联网上的所有Lorem Ipsum生成器都倾向于根据需要重复预定义的块,使其成为Internet上第一个真正的生成器。它使用超过200个拉丁词的字典,结合少数模型句子结构,生成看起来合理的Lorem Ipsum。因此,生成的Lorem Ipsum总是没有重复,注入幽默或非特征词等。

2 个答案:

答案 0 :(得分:3)

在部分

WITH (INDEX(PK_tFedDBLogMsg))
除了约束的名称之外,

PK_tFedDBLogMsg,视图上的聚集索引也是?

如果是这样,请务必同时使用NOEXPAND选项。

答案 1 :(得分:0)

“查询优化器自动使用索引视图”仅在Enterprise(和Developer)版本中可用。这意味着在企业版中,您还可以通过创建索引视图来优化查询:即使您未在查询文本中指定它,sql server也可以使用它

“索引视图的直接查询(使用NOEXPAND提示)”可用于所有版本

https://docs.microsoft.com/en-US/sql/sql-server/editions-and-components-of-sql-server-2016