Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 如果不使用范围、间隔等,则无法在TSQL中选择某些记录_Sql Server 2008_Tsql_Indexing_Sql Execution Plan_Hint - Fatal编程技术网

Sql server 2008 如果不使用范围、间隔等,则无法在TSQL中选择某些记录

Sql server 2008 如果不使用范围、间隔等,则无法在TSQL中选择某些记录,sql-server-2008,tsql,indexing,sql-execution-plan,hint,Sql Server 2008,Tsql,Indexing,Sql Execution Plan,Hint,在SQLServer2008R2数据库上,我有一个以单个整数作为主键的表。有时,当我对主键执行select时,我不会得到任何结果,但是如果我在主键上的某些值之间搜索所有记录,我就能够检索到该行。这只影响少数记录(百万行中不到一行)。绝大多数记录都可以通过简单的“equals”语句进行选择 有人知道是什么原因导致了这一问题,或者知道如何解决这一问题吗?我怀疑聚集索引可能有问题。如果我使用提示“index(0)”,那么我可以在不使用范围的情况下获取记录 详细信息: 语句1不产生任何结果: selec

在SQLServer2008R2数据库上,我有一个以单个整数作为主键的表。有时,当我对主键执行select时,我不会得到任何结果,但是如果我在主键上的某些值之间搜索所有记录,我就能够检索到该行。这只影响少数记录(百万行中不到一行)。绝大多数记录都可以通过简单的“equals”语句进行选择

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

详细信息:

语句1不产生任何结果:

select * from claim where claim_id = 12166769
语句2为索赔id 12166769生成一个结果:

select * from claim where claim_id > 12166768 and claim_id < 12166770
claim表有一个名为“claim_id”的列,该列被定义为主键integer,而不是null。它在主键上有一个名为“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
不返回任何行,而

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

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


DBCC检查表(表|名称|视图|名称[,{NOINDEX |索引| id}],{修复|允许数据|丢失|修复|快速|修复|重建]

DBCC检查表(表|名称|视图|名称[,{NOINDEX |索引| id},{修复|允许数据|丢失|修复|快速|修复|重建})我们已经安排DBCC CHECKDB每周运行一次,昨天没有报告任何错误,今晚我们将运行DBCC CHECKTABLE,看看它会产生什么结果。我唯一能想到的调试方法是从索引根开始,使用SQL Server Internal Viewer或
DBCC IND
DBCC PAGE
跟踪指针,看看它会带你去哪里。选择sys.fn_PhysLocFormatter(%%physloc%%)是什么,claim_id FROM claim,其中claim_id>12166774和claim_id<12166775表示返回的5行?我们昨晚运行了“dbcc checktable('claim'),查看它会产生什么结果,并且没有发现任何错误。今天早上,当我试图进一步研究这个问题时,我发现它似乎已经解决了。select语句现在返回我期望的行。既然我们在没有修复标志的情况下运行它,它还会修复问题吗?我们还运行了DBCC CHECKDB,我想这也应该捕获到它。我使用Perl脚本检查了整个数据库,以选择索赔ID集,然后分别选择它们,以确保它们都是“可选择的”。这个问题似乎在整个数据库中都得到了解决,我不知道还有什么可以解决它,所以我暂时将此标记为答案。我非常感谢大家的帮助。据我所知,如果你不使用修复工具,它就无法修复。我能想到的唯一一件事就是一个损坏的缓存被解决了,但这是一个问题。实际上,我也在想同样的事情,除了当我们回顾一些应用程序日志时,我们一直在考虑这个错误的副作用,对于这些条目,已经两周了。如果它是一个损坏的缓存,它会解释为什么添加不使用索引的提示将允许use在否则失败时检索行。
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