繁体   English   中英

SQL 服务器偶尔返回数周前的数据

[英]SQL Server returning weeks old data occasionally

SQL 服务器偶尔会使用 SSMS 和应用程序连接返回数小时到数周的数据。 问题持续的时间足以让我在应用程序和 SSMS 中验证问题,并运行稍微更改的查询以返回最新数据。 这发生在数据库中的多个表中。 但似乎一次被隔离为几行。 注意:每个 itemnumber 有 1 ROW,即非聚集索引。

SELECT tableA.itemnumber, tableA.location, tableB.itemtype 
from tableA left join tableB on tableA.itemnumber=tableB.itemnumber 
where tableA.warehouse = @warehouse and tableA.itemnumber in (@item1, @item2, ...)

但是,如果我直接从tableA中的 select 或将不同的查询连接到更多表,那么 SSMS 和应用程序都会返回当前数据的 1 行。 此外,我使用快照隔离、不隔离,甚至在不同用户下运行nolock来确认这种行为。

我想了解这是如何发生的以及解决此问题的可能方法。

该数据库最初来自我们的 ERP。
所有的表都是堆(没有聚集索引)。
在 2012 SQL 服务器上运行。
实现快照但不实现 RCSI。
据说每周都会重建索引(但无法确认,我看到索引碎片为 90)。

错误可能每天发生 10 次/10,000 次,但由于这些表中的数据全天不断变化,因此很难跟踪。 现在我正在交叉引用 2 个查询,当它们不匹配时,我会抛出一个错误并说稍后再试。

(我希望 tableA、tableB 不是实际的表名,或者我很想见到 ERP 开发人员只是想看看他们的样子)。

但是如果没有手头的数据,就很难说。 你有数据,所以你在一个比我们更好的 position 来追踪问题。 我会记下一些不受欢迎的行的 ID,看看它们是否会回来。 您的查询必须有充分的理由返回它们。 在此查询中,无论如何您都没有日期过滤器。 做一个select *并仔细查看。

是否会定期重新生成表,而您在错误的时间运行查询?

也许您可以在有问题的表中添加一个时间戳列,以便当您发现不正确的记录时,您将拥有插入/更新时间。 然后也许您将能够将这些错误与 ERP 中的活动关联起来(我们对此一无所知)。

或者可能某处存在错误,导致错误的行被更新,因此它们可能会出现并消失,因为它们的值一直在变化。 这就是为什么你应该隔离一些并监控它们的原因。

但如果没有深入了解您的环境、表结构和数据,恐怕我们所能做的就是猜测。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM