记录一次EF优化

问题描述:1、第一次加载过慢(EntityFramework 6 code-first)。2、一段时间间不访问页面同样变慢。

原因分析:1、第一次启动(Code First)会对比程序中的Model与数据库表(database initializer ),生成Model与数据库的映射视图

2、EF程序集没有生成本地镜像,这样每次程序启动,EF的代码都会通过just-in-time (JIT) compiler(即时编译器)把MSIL中间代码编译成本机能识别的本地代码。因为这个生成的本地代码存在程序运行的进程里面的内存中,它将回收当程序进程被终止(例如:iis程序池回收,程序池默认是按需触发运行的,没人访问它就不启动了)。由于EF框架还是比较大的,EF6文件大小到4-5M了,所以每次启动都要重写编译本地代码有比较明显的性能影响。

https://www.fusonic.net/en/blog/3-steps-for-fast-entityframework-6.1-code-first-startup-performance/

3、iis程序池回收或站点更新需要重新加载;

解决方案:

1、预生成映射视图(EF6.0+):

//预生成映射视图
            using (var dbcontext = new yourDbContext())
            {
                var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext;
                var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace);
                mappingCollection.GenerateViews(new List<EdmSchemaError>());
            }

参考:http://www.cnblogs.com/dudu/p/entity-framework-warm-up.html

实际情况可能要用到反射:

更多参考:http://www.cnblogs.com/yujiajun/p/EF_PreHeat.html

2、禁止EF第一次查询对__MigrationHistory访问(检查数据库和model是否匹配)(

  1. SELECT
  2. [GroupBy1].[A1] AS [C1]
  3. FROM ( SELECT
  4. COUNT(1) AS [A1]
  5. FROM [dbo].[__MigrationHistory] AS [Extent1]
  6. ) AS [GroupBy1]
  7. GO
  8. SELECT TOP (1)
  9. [Extent1].[Id] AS [Id],
  10. [Extent1].[ModelHash] AS [ModelHash]
  11. FROM [dbo].[EdmMetadata] AS [Extent1]
  12. ORDER BY [Extent1].[Id] DESC
  13. GO

:Database.SetInitializer<yourDbContext>(null);

3、使用n-gen 生成本地镜像 (to avoid jitting)

  更多参考:https://msdn.microsoft.com/en-us/data/dn582034

cd <Solution directory>\packages\EntityFramework.6.0.2\lib\net45
%WINDIR%\Microsoft.NET\Framework\v4.0.30319\ngen install EntityFramework.SqlServer.dll
%WINDIR%\Microsoft.NET\Framework64\v4.0.30319\ngen install EntityFramework.SqlServer.dll

4、application-initialization(IIS8内置)

Application Initialization Module for IIS 7.5

设置:application pool-StartModel 设置为 AlwaysRunning;WebSites:DoAppInitAfterRestart、Preload;

IIS程序池回收重启的时候就完成了加载,这样外部访问就不会“第一次访问”。

另外:为了减少重新编译dll带来的性能影响建议把各部分都单独的分层,编译成单独的dll;IIS可以设加大应用程序池的”闲置超时“的参数值。

时间: 2024-11-08 21:37:46

记录一次EF优化的相关文章

选取不在另一张表中记录的方法及优化

假设我们想从A表中选择一些记录,记录中的部分字段的取值是B表所不存在的,这里定义A表为源表,B表为参照表.例如,常见的例子部门表(Department)作为源表,员工表(Employee)作为参照表,可以从部门表中列举出那些员工表中所不包含的部门id来,即找出那些没有员工的部门.    一般类来说,如果数据库支持集合操作符,就可以直接查询,如果没有,就使用子查询.(1)DB2 and PostgreSQL:select deptno from deptexceptselect deptno fr

记录一次sql优化查询

场景:关联查询,一张主表关联4张表进行查询.主表数据量是16万,其中被关联的一张表的数量是6万. 遇到页面响应速度过慢的情况,首先考虑是否是sql查询缓慢引起的. 第一步开启mysql的慢查询日志(网上教程很多,本篇文章不再赘述) 第二步分析慢查询日志,这里要说下分析工具.常用的有两种,一是mysql自带的mysqldumpslow工具,二是pt-query-slow工具.后者需要自行安装,下面针对两种工具的使用进行说明: (1) mysqldumpslow 执行mysqldumpslow,如果

SQL&amp;EF优化第一篇 各种情况下的性能测试之count函数篇

测试环境  mssql 08  +win7    数据 30W条 二〇一六年十月二十九日 09:04:43 结论: *>1>主键>可空列    推测未论证: 根据情况优先选择* 因*无需判断某一列是否存在数据  1则是每次仍需要判断

数据库备份的脚本,记录下,还需优化下

由于公司数据比较重要,隔一段时间就需要备份,就写了个简单的shell来维护下... #!/bin/bash #backup database if [ $# -ge 1 ] ; then [email protected] else databaselist="dodo_account dodo_edu" fi for database in $databaselist do if [ ! -e /home/guimingming/backup_databases/$database

oracle的存储过程记录 及其他条件优化(尚未完善)

不想说多的,都写了这么多,直接上代码.用于长时间不使用之后的记忆 CREATE OR REPLACE PROCEDURE  TEST_RPOCEDURE IS NUMER1  NUMER;    -- 声明数字类型变量 STRING1 VARCHAR2(50);  -- 声明字符串类型变量 COLUME  NUMBER CONSTANT := 1;   -- 声明直接赋值的常量 row_test TABLE_A%ROWTYPE;  -- 声明类型为表A的行数据类型 TEST_CUR CURSER

优化EF Code First第一次请求速度

由于EF Code First模式没有模型文件,所以很多一次请求的时候速度比较慢,EF需要将对应的数据库映射关系加载到内存里面,往后请求就比较快.可以通过在程序初始化的时候增加一段代码来优化EF第一次执行的速度,具体代码如下 //EF暖机操作 using (CompanyContext dbContext = new CompanyContext()) { var objectContext =((IObjectContextAdapter)dbContext).ObjectContext; v

记录一次性能优化(转)

春节期间,和朋友一起做了一个关于物流行业的系统优化,在此记录一下优化过程及过程中遇到的问题,用以备忘,同时分享给有类似需要的朋友. 首先交代一下背景: 数据库采用MS SqlServer 2008 R2, 数据库物理文件大小为150G. 系统大部分报表采用存储过程实时统计,前台系统通过视图实现. 快递物流行业,平均每天产生8000票新快递单,关系到单据网点及状态的流转,每票快递单表现在数据库中大概会产生8张新的其他跟踪单据. 数据库服务器: 8核CPU 256G 内存 1T固态硬盘, Windo

EF中执行sql语句

EF原理 EF 会自动把 Where().OrderBy().Select()等这些编译成"表达式树(Expression Tree)",然后会把表达式树翻译成 SQL 语句去执行.(编译原理,AST)因此不是"把数据都取到内存中,然后使用集合的方法进行数据过滤",因此性能不会低.但是如果这个操作不能被翻译成 SQL 语句,则或者报错,或者被放到内存中操作,性能就会非常低 跟踪EF的查询Sql语句: DbContext 有一个 Database 属性,其中的 Log

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表