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

标签 sql .net sql-server linq-to-sql sql-server-2008-r2

我们有一个 .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/

相关文章:

mysql - 如果两列具有特定值,如何设置值?

sql - ORA-00205 : error in identifying control file, 检查警报日志以获取更多信息

.NET:处理 HashAlgorithm 对象

sql - 当有 6 个月的间隙时,抓取所有内容,如果没有 6 个月的间隙,则抓取所有 sql

sql-server - 如何删除 Sql Server 2005 中存在的临时 SP

sql - SQL vs NoSQL构建示例

mysql - 使用 MySQL 比较两个字符串

.net - Entity Framework 6 设置连接字符串运行时

c# - 我可以在 .net 应用程序中暂时启用 FIPS 吗?

c# - 从 DataSet 创建 SQL Server 数据库