由于我无法向previous question发布答案,我决定开一个新帖子。为了使用该帖子中的代码,我必须分别将WITH ( ... , INDEX ( IX_REQUESTID ) )
和WITH ( ... , INDEX ( IX_REQUESTIDREF ) )
提示添加到表Request
和Options
。似乎SQL Server无法找到自己使用的索引,因为现在它正确地完成了工作。但现在问题是其他...我在语句ORDER BY Priority, DateEntered
中附加了句子,即使(Priority, DateEntered) INCLUDE (RequestID)
上的RequestTable
上有索引,但Query2再没有返回结果...这次有什么不妥?请帮助我,因为这非常重要,我自己无法找到答案。
答案 0 :(得分:1)
可能还有其他要求我不知道,但是当我的代码达到一定程度的复杂性时,我通常会退后一步并问自己 - 我可以做些简单的事情。
在这种情况下,您是否可以仅在Request表上运行查询并将返回的值存储到tablevar中?
您可能需要设置事务隔离级别Serializable以获得所需的行锁定。但不确定 - 需要尝试使用和不使用。
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
DECLARE @TempResults TABLE (RequestID int, Priority int, DateEntered DateTime)
INSERT INTO @TempResults (RequestId, Priority, DateEntered)
SELECT TOP 2 RequestId, Priority, DateEntered FROM Request WITH (ROWLOCK, UPDLOCK, READPAST)
ORDER BY Priority, DateEntered
现在,在tablevar和Options表之间锁定行,以返回您需要的结果集。
SELECT * FROM @TempResults Request INNER JOIN Options ON Request.RequestID = Options.RequestIDRef
如果这不是您的选择,我道歉。