我遇到了一个非常奇怪的问题,关于什么似乎是某种腐败指数。在dbcc checkdb将它拾取的意义上没有损坏,但在它有不应该有的行的意义上是腐败。
我有两个表,TableA和TableB。出于我的应用程序的目的,某些行被视为功能上重复,这意味着虽然并非所有列值都相同,但我的应用程序将该行视为dup。为了过滤掉这些,我创建了一个名为vTableAUnique的视图。视图定义如下:
SELECT a.*
FROM TableA a
INNER JOIN
(
SELECT ID, ROW_NUMBER() OVER
(PARTITION By Col1
ORDER BY Col1) AS Num
FROM TableA
) numbered ON numbered.ID = a.ID
WHERE numbered.Num = 1
视图的结果是TableA中的所有记录,其中TableA中没有任何其他行与Col1具有相同的值。对于此示例,假设TableA总共有10行,但只有7行具有显示在vTableAUnique中的不同值。
TableB基本上只是一个与TableA的Col1值匹配的值列表。在这种情况下,假设TableB具有出现在vTableAUnique中的所有8个唯一值。因此,TableA,TableB和vTableAUnique中的数据如下所示:
TableA (ID, Col1, Col2, Col3)
1,A,X,X
2,A,X,X
3,B,X,X
4,A,X,X
5,E,X,X
6,F,X,X
7,G,X,X
8,H,X,X
9,I,X,X
10,J,X,X
TableB (ID)
A
B
C
D
E
F
G
H
I
J
vTableAUnique (ID, Col1, Col2, Col3)
1,A,X,X
3,B,X,X
5,E,X,X
6,F,X,X
7,G,X,X
8,H,X,X
9,I,X,X
10,J,X,X
所以这是奇怪的部分。有时当我在Col1上加入带有TableB的vTableAUnique时,我会从TableA中找回非不同的值。换句话说,当我进行连接时,会出现在vTableAUnique中不存在但在TableA中存在的行。如果我选择刚刚关闭vTableAUnique,我不会得到这些行。在这种情况下,我不仅会返回具有1,3,5,6,7,8,9,10的ID的行,而且还会返回具有2和4的ID的行!
在我的头撞到我的桌子后,我决定尝试重建数据库中的所有索引。果然,问题就消失了。相同的查询现在返回正确的行。然而,在一段不确定的时间之后,问题又回来了。 DBCC CHECKDB没有显示任何问题,我很难跟踪哪个索引可能导致此问题。
我在Vista x64上使用SQL Server 2008 Developer Edition。
HELP!
答案 0 :(得分:4)
ROW_NUMBER() OVER (PARTITION By Col1 ORDER BY Col1)
不是稳定的排序顺序,它可以根据访问路径从查询更改为查询。
您的观点可能会多次运行不同的结果。
重建索引似乎会影响排序顺序。
使用此:
ROW_NUMBER() OVER (PARTITION By Col1 ORDER BY Id)
相反,它保证了稳定的排序顺序。
答案 1 :(得分:0)
编写索引脚本并查看脚本,它是用ALLOW_DUP_ROW创建的吗?如果是这样那可能是你的问题