Sql server 2005 视图、联接、锁定和排序方式
我使用创建了一个视图Sql server 2005 视图、联接、锁定和排序方式,sql-server-2005,locking,views,Sql Server 2005,Locking,Views,我使用创建了一个视图 CREATE VIEW NewView AS WITH TableA AS ( SELECT * FROM RealTableA WITH (ROWLOCK, UPDLOCK, READPAST) WHERE (Something1) ) , TableB AS ( SELECT * FROM RealTableB WITH (ROWLOCK, READPAST) WHERE (Something2) ) SELECT * FROM TableA INNER
CREATE VIEW NewView AS
WITH TableA AS
(
SELECT * FROM RealTableA WITH (ROWLOCK, UPDLOCK, READPAST) WHERE (Something1)
)
,
TableB AS
(
SELECT * FROM RealTableB WITH (ROWLOCK, READPAST) WHERE (Something2)
)
SELECT * FROM TableA INNER JOIN TableB ON (TableA.ID = TableB.RefID)
而且一切都很顺利——同时运行的两个进程从视图中选择将从中选择不同的记录。问题是现在我想使用一个orderby
子句,尽管我已经使用了
CREATE NONCLUSTERED INDEX IX_SOMEINDEX ON RealTableB ( Field1 ASC , Field2 ASC ) INCLUDE ( RefID )
当我使用时,一切都停止了
按字段1 ASC、字段2 ASC从NewView订单中选择顶部(@Something)*
我的意思是,Process1正确地选择了第一个@Something
结果,但Process2不返回任何结果,这表明可能存在表锁(但为什么,如果我有一个按字段排序的索引?)。但是,如果我删除orderby
子句,它工作得很好,但是没有所需的顺序。我在CTE中使用(INDEX(IX_SOMEINDEX))
尝试了,但没有成功。我真的需要尽快完成这项工作。有人能帮我吗?不要使用SELECT*。如果要求所有列,将进行表扫描(通常显示为聚集索引扫描)。您的一个表因此锁定了所有行
将视图更改为此,并将提示放在外部。然后索引它
CREATE VIEW NewView
WITH SCHEMABINDING
AS
SELECT
--real column list
FROM
RealTableA
INNER JOIN
TableB ON (TableA.ID = TableB.RefID)
WHERE
(Something1) AND (Something2)
如果失败(例如,根据前面的问题,您有一个LOB列),您需要发布100%准确的代码、100%准确的数据和100%准确的查询。通常情况下,我们无法帮助处理经过消毒的代码。那么,有什么办法可以解决这个问题呢?在最后一次选择中仅选择一列会产生相同的结果。不要使用select*。这允许在视图中使用SCHEMABINDING。这意味着视图可以被索引。请添加文本计划(非XML)我没有可用的SQL Server探查器。对不起。。。我试着使用索引视图,但结果却是一团糟,仍然没有结果…打开SHOWPLAN文本:是否停止使用SELECT*?是的,我停止了。。。但结果仍然是一样的。我现在就发布执行计划。