我们有一个 .NET 应用程序,使用 LINQ to SQL (ORM) 来调用包含来自不同数据库中的多个对象的联接的 View 。 .NET 应用程序调用此 View 超时,但是我们的 DBA 运行以下语句:
sp_refreshview on the view and the subsequennt sql views
应用程序再次开始运行。
近 20 分钟后,该应用程序在同一 View 上再次开始超时。所以我们的DBA安排了一个作业,每30分钟运行一次上述语句。 View 没有发生结构性变化,我们正在尝试弄清楚为什么 sp_refreshview
修复了这个问题,以及我们可以修复的潜在问题是什么?
最佳答案
sp_refreshview
解决该问题的原因是该 View 不受架构限制。 SQLServer 保留有关 View 的元数据以帮助执行,并且由于 View 不受架构限制,因此随着基础对象的更新,元数据会变得过时(想想 DML 语句)。 sp_refreshview
的作用是更新非架构绑定(bind) View 的元数据,以便它们能够以最佳方式运行。看看documentation对于sp_refreshview
。
为了解释为什么这是有效的,想一下什么是 View ? View 只是一个查询。存储的元数据与该查询相关。
每当您运行查询时,服务器都会找出运行该查询的最佳方式(称为计划),这取决于查询中使用的表的统计信息。当表中的数据发生变化时,表的统计信息也会发生变化,因此计划也会发生变化。当您创建 View (非架构绑定(bind))时,会存储有关最佳执行的元数据(很可能是计划)。由于 View 只是一个查询,因此计划可能会过时,sp_refreshview
会更新该元数据。
关于.NET 应用程序使用的 SQL View 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42382170/