.NET应用程序使用的SQL View超时

Baa*_*ali 10 .net sql sql-server linq-to-sql sql-server-2008-r2

我们有一个使用LINQ to SQL(ORM)的.NET应用程序来调用一个视图,该视图包含来自不同数据库中多个对象的连接..NET应用程序超时调用此视图,但是我们的DBA运行以下语句:

sp_refreshview on the view and the subsequennt sql views
Run Code Online (Sandbox Code Playgroud)

应用程序再次开始运行.

该应用程序在接近20分钟后再次在同一视图上开始超时.因此,我们的DBA安排了一项工作,每30分钟运行一次上述声明.该视图没有结构上的变化,我们正试图弄清楚为什么要sp_refreshview修复这个问题以及我们可以解决的潜在问题是什么?

Jac*_*ert 3

解决该问题的原因sp_refreshview是该视图不受架构限制。SQLServer 保留有关视图的元数据以帮助执行,并且由于视图不受架构限制,因此随着基本对象的更新(想想 DML 语句),元数据会变得过时。所做sp_refreshview的就是更新非架构绑定视图的元数据,以便它们能够以最佳方式运行。查看的文档sp_refreshview

为了解释为什么这是有效的,想一下什么是视图?视图只是一个查询。存储的元数据与该查询相关。

每当您运行查询时,服务器都会找出运行该查询的最佳方式(称为计划),这取决于查询中使用的表的统计信息。当表中的数据发生变化时,表的统计信息也会发生变化,因此计划也会发生变化。当您创建视图(非架构绑定)时,会存储有关最佳执行的元数据(很可能是计划)。由于视图只是一个查询,因此计划可能会过时并sp_refreshview更新元数据。