Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 视图、联接、锁定和排序方式_Sql Server 2005_Locking_Views - Fatal编程技术网

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*?是的,我停止了。。。但结果仍然是一样的。我现在就发布执行计划。