1

在 SQL Server 2008 R2 数据库上,我有一个以单个整数作为主键的表。有时,当我对主键执行选择时,我没有得到任何结果,但如果我在某些值之间搜索主键上的所有记录,我就能够检索该行。这仅影响少数记录(数百万行中不到十个)。绝大多数记录都可以用一个简单的“等于”语句来选择。

有谁知道这可能是什么原因或如何解决这个问题?我怀疑聚集索引可能有问题。如果我使用提示“index(0)”,那么我可以在不使用范围的情况下获取记录。

细节:

语句 1 不产生任何结果:

select * from claim where claim_id = 12166769

语句 2 为 claim_id 12166769 生成一个结果:

select * from claim where claim_id > 12166768 and claim_id < 12166770

这两个语句都使用使用 PK_claim_claim_id 的聚集索引搜索。

语句 3 使用提示为 claim_id 12166769 生成一个结果:

select * from claim  with (index(0)) where claim_id = 12166769

声明表有一个名为“claim_id”的列,定义为主键,整数,不为空。它在名为“PK_claim_claim_id”的主键上有一个聚集索引。

我正在使用 SQL Sentry Plan Explorer 查看计划树。语句 1 有 1 个估计行和 0 个实际行。语句 2 有 7 个估计行和 1 个实际行。

更新 另外我们发现当我们跑

select * from claim where claim_id > 12166774 and claim_id < 12166775

我们返回了五行,从 12166770 到 12166774。运行

select * from claim with (index(0))  where claim_id > 12166774 
and claim_id < 12166775

提示没有按预期返回任何记录。

2012 年 6 月 22 日更新

我说得太早了。我们在不同的地方发现了这个错误。我发现我实际上并没有扫描整个数据库,只扫描了其中的一部分。

select * from claim where claim_id in (8223749,8223752,8223753,8223754,8223755)

不返回任何行,而

select * from claim with (index(0))
    where claim_id in (8223749,8223752,8223753,8223754,8223755)

返回行。我跑了

SELECT sys.fn_PhysLocFormatter(%%physloc%%),claim_id FROM claim with (index(0)) 
WHERE claim`_id in (8223749,8223752,8223753,8223754,8223755)

并收到

(3:1394868:2)   8223749
(3:1394868:5)   8223752
(3:1394868:6)   8223753
(3:1394868:7)   8223754
(3:1394868:8)   8223755
4

1 回答 1

0

由于我的评论似乎解决了问题,我将继续发布作为答案。

DBCC CHECKTABLE (table_name | view_name [ , { NOINDEX | index_id } |, { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] )

于 2012-06-19T18:22:37.480 回答