我遇到了一个非常奇怪的问题,该问题似乎是某种损坏的索引。从 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。
帮助!