1

我遇到了一个非常奇怪的问题,该问题似乎是某种损坏的索引。从 dbcc checkdb 将拾取它的意义上说不是损坏,但从它具有不应该具有的行的意义上说是损坏的。

我有两个表,TableA 和 TableB。出于我的应用程序的目的,某些行在功能上被认为是重复的,这意味着虽然并非所有列值都相同,但我的应用程序将该行视为重复。为了过滤掉这些,我创建了一个名为 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 上将 vTableAUnique 与 TableB 连接时,我会从 TableA 中取回非不同的值。换句话说,在 vTableAUnique 中不存在但在 TableA 中存在的行会在我执行连接时出现。如果我在 vTableAUnique 之外进行选择,我不会得到这些行。在这种情况下,我不仅会返回 ID 为 1、3、5、6、7、8、9、10 的行,还会返回 ID 为 2 和 4 的行!

在把头撞在桌子上之后,我决定尝试重建数据库中的所有索引。果然,问题消失了。现在,相同的查询返回了正确的行。然而,经过一段不确定的时间后,问题又回来了。DBCC CHECKDB 没有显示任何问题,我很难追踪可能导致此问题的索引。

我在 Vista x64 上使用 SQL Server 2008 Developer Edition。

帮助!

4

2 回答 2

4
ROW_NUMBER() OVER (PARTITION By Col1 ORDER BY Col1)

不是一个稳定的排序顺序,它可以根据访问路径从查询更改为查询。

您的视图可能会返回多次运行的不同结果。

重建索引似乎会影响排序顺序。

用这个:

ROW_NUMBER() OVER (PARTITION By Col1 ORDER BY Id)

相反,它保证了稳定的排序顺序。

于 2009-02-10T15:46:51.763 回答
0

编写索引并查看脚本,它是使用 ALLOW_DUP_ROW 创建的吗?如果是这样,那可能是你的问题

于 2009-02-10T15:18:35.670 回答