在 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