我使用
创建了一个视图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 ) )
,但它没有用。我真的需要尽快完成这项工作。有人可以帮帮我吗?
答案 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&准确的查询。我们通常无法帮助处理消毒代码。