视图,连接,锁定和排序

时间:2011-06-20 16:27:17

标签: 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 JOIN TableB ON (TableA.ID = TableB.RefID)

并且一切顺利 - 从视图中选择的两个进程同时运行将从中选择不同的记录。问题是现在我想使用ORDER BY子句,即使我已经使用了

CREATE NONCLUSTERED INDEX IX_SOMEINDEX ON RealTableB ( Field1 ASC , Field2 ASC ) INCLUDE ( RefID )

当我使用

时,一切都会消失

SELECT TOP (@Something) * FROM NewView ORDER BY Field1 ASC , Field2 ASC

我的意思是,Process1正确地选择了第一个@Something结果,但是Process2没有返回任何内容,表示可能的表锁(但是为什么,如果我按照我订购的字段有索引?)。但是,如果我删除ORDER BY子句,它可以很好地工作,但没有所需的顺序。我尝试了CTE中的WITH ( INDEX ( IX_SOMEINDEX ) ),但它没有用。我真的需要尽快完成这项工作。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

不要使用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&准确的查询。我们通常无法帮助处理消毒代码。

相关问题