损坏的SQL Server索引?

时间:2009-02-10 15:14:37

标签: sql sql-server sql-server-2008 indexing corrupt

我遇到了一个非常奇怪的问题,关于什么似乎是某种腐败指数。在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!

2 个答案:

答案 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创建的吗?如果是这样那可能是你的问题