C# 预编译视图不影响性能

C# 预编译视图不影响性能,c#,asp.net,entity-framework,c#-4.0,entity-framework-4,C#,Asp.net,Entity Framework,C# 4.0,Entity Framework 4,编辑: 这个问题不是关于编译的查询,而是关于在编译时生成EF数据库视图 从ADO.NET团队博客:: 视图生成56%–创建数据库的抽象视图的很大一部分是以商店的本地语言为查询和更新提供实际视图。在此步骤中,将创建存储视图。好消息是有一种方法可以使视图生成成为构建过程的一部分,这样就可以避免在运行时执行此步骤 我的web应用程序中的第一次数据库调用大约需要2.5秒,而后续相同的调用大约需要30毫秒 我使用来自的T4模板生成了一个预编译的视图源文件,但它没有产生可检测的差异 T4模板运行大约需要2

编辑:

这个问题不是关于编译的查询,而是关于在编译时生成EF数据库视图

从ADO.NET团队博客::

视图生成56%–创建数据库的抽象视图的很大一部分是以商店的本地语言为查询和更新提供实际视图。在此步骤中,将创建存储视图。好消息是有一种方法可以使视图生成成为构建过程的一部分,这样就可以避免在运行时执行此步骤


我的web应用程序中的第一次数据库调用大约需要2.5秒,而后续相同的调用大约需要30毫秒

我使用来自的T4模板生成了一个预编译的视图源文件,但它没有产生可检测的差异

T4模板运行大约需要2.5秒,生成的代码将被编译


我遗漏了什么?

在生成应用程序后,您对应用程序的第一次调用,web服务器将卸载应用程序,第一次调用将再次“启动”应用程序,以及与此相关的所有内容。这与预编译视图无关。因此,在加载应用程序时,第一次调用总是需要更长的时间


顺便说一句,同样的事情也会发生在生产服务器上。空闲工作池很可能会卸载您的应用程序,下一次调用将再次加载应用程序,执行请求的时间比通常的请求要长得多。

构建后对应用程序的第一次调用,web服务器将卸载应用程序,第一次调用将再次“启动”应用程序,以及与之相关的一切。这与预编译视图无关。因此,在加载应用程序时,第一次调用总是需要更长的时间

顺便说一句,同样的事情也会发生在生产服务器上。空闲的工作池很可能会卸载您的应用程序,下一次调用将再次加载应用程序,执行该应用程序所需的时间比通常的请求要长得多。

修复了它

从EntityViewContainer派生的生成视图必须位于包含STOs自跟踪对象的程序集中,而不是包含edmx模型的程序集中。

修复了它


从EntityViewContainer派生的生成视图必须位于包含STOs自跟踪对象的程序集中,而不是位于包含edmx模型的程序集中。

为什么您认为预编译视图对“第一次数据库调用”所需的时间影响甚微?我读到了@KirkWoll-我错了吗?你说的“第一”是什么意思。页面生命周期中的第一个,代码更改后的第一个,服务器重新引导后的第一个。首先是什么?那么你认为编辑视图不需要任何资源?哎哟第一次调用自然很慢。@TomTom为什么生成视图并将其编译到我的程序集中对第一次调用所花费的时间没有任何影响?为什么您认为预编译的视图会对“第一次数据库调用”所花费的时间有丝毫影响?@KirkWoll我读到了-我错了吗?您的意思是什么“首先。页生命周期中的第一个,代码更改后的第一个,服务器重新引导后的第一个。首先是什么?那么你认为编辑视图不需要任何资源?哎哟第一次调用自然很慢。@TomTom为什么生成视图并将其编译到我的程序集中对第一次调用所花费的时间没有任何影响?是的-我可以看到这种情况发生,但我只是对数据库调用进行计时-这就是我提出问题的时间。@user1055425,您的第一次数据库调用也将花费更长的时间。请记住,在幕后,框架很可能是共享数据库连接。与最初的连接相比,后续连接花费的时间相对较少。我在问题中提供了更多信息。当然,打开数据库连接不应该花费2.5秒?变量太多了。服务器有多忙,从应用程序运行的位置到服务器的路径。我看不出你在代码上有什么不同,除了在启动时对db进行一次虚拟调用,以强制第一次调用“不可见”。是的,我可以看到这种情况发生,但我只是对数据库调用进行计时,这就是我提出问题的时间。@user1055425,你的第一次数据库调用也将花费更长的时间。请记住,在幕后,框架很可能是共享数据库连接。与最初的连接相比,后续连接花费的时间相对较少。我在问题中提供了更多信息。当然,打开数据库连接不应该花费2.5秒?变量太多了。服务器有多忙,从应用程序运行的位置到服务器的路径。我看不出你在代码上有多大的不同,除了在启动时对db进行一次虚拟调用以强制第一次调用“不可见”。你应该排除你自己的答案。你应该排除你自己的答案。