0

我有一个观点让我非常疯狂..

AlarmMsg如下所示:

[TypeID] [smallint] NULL,
[SEFNum] [int] NULL,
[ServerName] [nvarchar](20) NOT NULL,
[DBName] [varchar](20) NOT NULL,
[PointName] [varchar](50) NOT NULL,
[AppName] [varchar](50) NOT NULL,
[Description] [varchar](100) NOT NULL,
[Priority] [tinyint] NOT NULL,
[Value] [float] NOT NULL,
[Limit] [float] NOT NULL,
[Msg] [nvarchar](255) NULL,
[DateStamp] [datetime2](7) NULL,
[UID] [uniqueidentifier] NOT NULL

在该AlarmMsg表的顶部是一个应用的视图,如下所示:

CREATE VIEW AlarmMsgView 
AS
SELECT     TOP (2000) WITH TIES 
    SEFNum, ServerName, DBName, 
    PointName, AppName, Description, 
    Priority, Value, Limit, Msg, 
    DateStamp, UID
FROM      dbo.AlarmMsg WITH (NOLOCK)
ORDER BY DateStamp DESC

此查询直接针对表返回预期的十 (10) 行:

SELECT TOP(10) [SEFNum]
FROM [RTIME_Logs].[dbo].[AlarmMsg] 
where [Priority] = 1

对视图的相同查询返回......没有(!):

SELECT TOP(10) [SEFNum]
FROM [RTIME_Logs].[dbo].[AlarmMsgView] 
where [Priority] = 1 

该表AlarmMsg包含大约 11M+ 行,并在 column 上声明了一个 FT 索引Msg

有人可以告诉我这里发生了什么,我想我正在失去理智。

4

1 回答 1

-1

NOLOCK 会导致此问题。

阅读这个这个

基本上,NOLOCK 来自 SQL Server 2000 时代。它需要被遗忘。你已经升级了你的 SQL Server(我希望如此),所以你需要升级你的查询。考虑切换到READ_COMMITTED_SNAPSHOT以“无阻塞”方式读取数据。阅读此处以确定哪种隔离级别最适合您的情况

编辑:阅读作者的评论后,我认为这是原因:

SQL Server 没有做错任何事情。将您的视图视为主查询的子查询,如下所示:

SELECT * FROM (SELECT TOP(2000) col1, col2 FROM aTable ORDER BY Date1 DESC) WHERE priority = 1. 

在这种情况下,将首先执行括号中的查询,并将 WHERE 子句应用于结果集

于 2013-02-13T01:44:26.873 回答