【发布时间】:2015-01-19 09:54:37
【问题描述】:
我不明白为什么我不能在我的视图中使用主键作为索引。
这是主表
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 的一段话,你需要确保文本中间没有隐藏任何令人尴尬的东西。 Internet 上的所有 Lorem Ipsum 生成器都倾向于根据需要重复预定义的块,这使其成为 Internet 上第一个真正的生成器。它使用包含 200 多个拉丁词的字典,结合少量的模型句子结构,生成看起来合理的 Lorem Ipsum。因此,生成的 Lorem Ipsum 始终没有重复、注入幽默或非特征词等。
【问题讨论】:
-
抱歉,“PS”stackoverflow 让我在不知道还能说什么时添加详细信息。
-
所以,你有一个表
**x**FedDBLogMsg,它的索引叫做PK_**t**FedDBLogMsg。您有视图**t**FedDBLogMsg,它在(另一个?)数据库FedDBMsg中引用**t**FedDBLogMsg。然后你就有了引用MyGolf数据库的存储过程。它非常混乱,有很多非常相似的标识符和混合的数据库。我想,首先要检查这里没有错别字。 -
tFedDBLogMsg 是一个替换旧表的视图。因此它被命名为旧表
-
看来你应该重写你的问题。在没有索引提示的情况下进行查询,显示执行计划,指出执行计划的问题以及您认为该计划错误的原因。询问如何强制优化器将执行计划更改为您需要的。
-
从您目前看到的情况来看,
xFedDBLogMsg表只有一个主聚集索引。所以,我认为它总是会在任何查询中使用,根本没有其他选择。它可以用作扫描或搜索。来自 MSDN:“如果存在聚集索引,则 INDEX(0) 强制进行聚集索引扫描,INDEX(1) 强制进行聚集索引扫描或查找。”因此,您可以尝试这种形式的索引提示,看看它是否对执行计划进行了任何更改。
标签: sql-server sql-server-2008-r2 query-hints