Entity Framework Code First+SQL Server,改变聚集索引,提高查询性能
.net Entity Framework(调研的是Entity Framework 4.0) code first方式生成数据库时,不能修改数据库表的索引,而SQLServer默认会把数据表的主键设置为聚集索引,所以Entity Framework如果要修改索引,只能执行sql脚本修改。
这里主要介绍一下调研修改聚集索引来提升查询性能的过程。
系统环境
我们做的是一个form程序,多个客户端直接访问数据库。对于此系统,用户没有需求在短时间内插入大量的数据,只需要满足一般的业务需求即可,但是用户需要一些复杂的查询,有些复杂的查询包括了5个表的查询,这5个表的查询中,有三个表的查询条件加起来有30个,而且每个表还有好多模糊查询(主要是为了用户能查询到数据,所以模糊查询还是必须的)。
我们使用的ORM框架的是.net 的Entity Framework,版本是4.0,开发环境是vs2010,用Entity Framework的code first方式生成数据库,数据库中每张表的主键是无序的GUID。
在开发测试中发现的一些问题
一个系统随着数据量的增加,性能还是很重要的。所以我们在测试的时候,制造了一些数据,用于平时的性能测试。主要的表有20w数据,5个表加起来有70w左右的数据。在测试时,发现在这个数量级的数据下,有些复杂的查询会很慢(每次查询清理数据库缓存来查询,清理缓存的语句:DBCC freeproccache;DBCC dropcleanbuffers;),有的甚至到了20多秒才能查询出来结果,虽然这个查询不是经常使用的查询,但是对于用户来说,肯定体验不够好,于是就开始调研怎么才能查询快一些。
调研过程
首先,想到的是手动编写SQL来代替Entity Framework自动生成的SQL,因为Entity Framework自动生成的SQL经过一系列的转化,最后变得很复杂,而且阅读性不够好。于是手动写了几个sql的查询条件的语句,然后在SqlServer管理界面直接执行脚本,查看手写与Entity Framework生成的同样条件的脚本(Entity Framework生成的脚本是用Sql Server Profiler捕捉得到的)查询性能有多大差距。
得到的结论是手写的脚本比Entity Framework生成的有的提升性能不大,有的反而比Entity Framework生成的还慢了,执行脚本时,也是每次查询都清理数据库缓存。除非对SQL很深入的了解,知道怎么能很好的提升性能,否则自己写的比自动生成的还慢了。对数据库查询比较了解的可以自己尝试一下,看看能不能大幅度提高。
其次,查阅了网上关于SQL提升查询性能的文章,大多提到的是设置正确的索引能提升性能,对我帮助很大的是这几个网页:
http://www.cnblogs.com/marvin/p/4123745.html
http://www.cnblogs.com/chenmh/p/3999475.html
http://www.cnblogs.com/zhouruifu/archive/2012/04/18/2454088.html
我发现我们系统生成的数据库,每张表的Id都是聚集索引,都是无序的GUID,于是就想着更改几张表的聚集索引。刚开始我在查找有没有简单的修改索引的方法,可不可以直接删除聚集索引,然后更改其它某个字段为聚集索引,因为好多表与我们查询的主表有关联,有一些外键,所以索引不能直接删除,除非先把这些外键删除,但是删除外键后担心有些表关联查询就会慢了,于是就开始尝试着先删除使用到这几个表主键作为外键的外键,查找要删除的外键很简单,删除表的主键的聚集索引,会提示有还有哪个外键不能删除,如下图所示。

等所有的约束删除后,主键的聚集索引就可以删除了。注意,删除的时候请记住删除了哪些外键,等修改聚集索引后,还需要把这些删除的外键加上,不知道怎么加外键?请查看每个表的Create语句。
然后选择表的某个字段作为聚集索引,之后再把表的Id修改为非聚集索引。
最后,5个表中,三个表修改好聚集索引后,可以测试性能是否有所提高了。
修改索引的脚本写好后,开始在SQL Server的2005和2008上做测试。
以下是我在SQL Server 2008上测试结果

以下是我在SQL Server 2005上测试结果

测试结论
修改索引后,查询速度比不修改索引时快,速度提高了一半以上,但是插入数据时会相对慢一些,虽然慢一些,但是都是在1秒之内,尤其在Sql Server 2008上比较明显。
当然这个提高幅度不是特别大很多,如果数据量再大一些,到了百万级别,也许这个解决方案可能效果不太明显,百万级别的没有进一步测试。
初次写长篇文章,有些数据不便于与大家分享,欢迎大家提意见和建议,如果有更好的方案来提升性能,那就最好不过了。
Entity Framework Code First+SQL Server,改变聚集索引,提高查询性能的更多相关文章
- SQL Server-聚焦过滤索引提高查询性能(十)
前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...
- SQL Server-聚焦过滤索引提高查询性能
前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...
- SQL查询优化:详解SQL Server非聚集索引(转载)
本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...
- T-SQL查询高级--理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤
写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完.这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章 ...
- 但从谈论性能点SQL Server选择聚集索引键
简单介绍 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是依照聚集索引的列作为keyword进行了. 因此对于聚集索引的选择对性能的影响就变 ...
- SQL Server 非聚集索引的覆盖,连接,交叉和过滤 <第二篇>
在SQL Server中,非聚集索引其实可以看做是一个含有聚集索引的表,但相对实际的表来说,非聚集索引中所存储的表的列数要少得多,一般就是索引列,聚集键(或RID).非聚集索引仅仅包含源表中的非聚集索 ...
- SQL Server的聚集索引和非聚集索引
微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)…… (一) ...
- SQL SERVER中非聚集索引的覆盖,连接,交叉,过滤
1.覆盖索引:select和where中包含的结果集中应存在“非聚集索引列”,这样就不用查找基表了,索引表即可搞定: 2.索引交叉:索引的交叉可以理解成建立多个非聚集索引之间的join,如表实体一 ...
- SQL Server 百万级数据提高查询速度的方法
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
随机推荐
- 基于Vue.js的大型报告页项目实现过程及问题总结(一)
今年5月份的时候做了一个测评报告项目,需要在网页正常显示的同时且可打印为pdf,当时的技术方案采用jquery+template的方式,因为是固定模板所以并没有考虑报告的模块化区分,九月底产品提出新的 ...
- Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码正则表达式
Java 常用正则表达式,Java正则表达式,Java身份证校验,最新手机号码校验正则表达式 ============================== ©Copyright 蕃薯耀 2017年11 ...
- 离线缓存 manifest
程序的离线缓存由一个叫做manifest的文本文件控制,把需要离线缓存的文件列在里面即可,这个列表还可以控制需要缓存的情况,甚至当用户从缓存地址进入到没有缓存的地址应该显示什么 当浏览器下载解析了ma ...
- .net ef core 领域设计代码转换(上篇)
一.前言 .net core 2.0正式版已经发布几个月了,经过研究,决定把项目转移过来,新手的话可以先看一些官方介绍 传送门:https://docs.microsoft.com/zh-cn/dot ...
- day2--SecureCRT的配置
生产中,我们是看不到虚拟机的工作界面,虚拟机的界面相当于机房显示屏的样子,实际上我们是在操作工具里面进行管理,这里使用SecureCRT远程连接虚拟机,SecureCRT的设置如下: 1.打开Secu ...
- JMeter基础教程3:脚本录制篇
对于一些JMeter初学者来说,录制脚本可能是最容易掌握的技能之一.虽然我不建议录制性能脚本(因为录制的脚本比较混乱,必须要通过二次处理才可正常使用),但有时做总比不做要好,是吧?下面我们详细介绍使用 ...
- 走进Spark生态圈:环境的安装与配置
什么是Spark? Apache Spark 是一种大规模数据处理的快速通用引擎,使用基于内存的处理方式,较与MapReduce而言,解决了其shuffle多次IO操作带来的效率低问题,从而达到快速的 ...
- C#抓取和分析网页的类
抓取和分析网页的类. 主要功能有: Ontology 1.提取网页的纯文本,去所有html标签和javascript代码 2.提取网页的链接,包括href和frame及iframe 3.提取网页的ti ...
- struts2 内容记录
多xml文件配置 在开发过程中我们经常会将每一张表(如:user表)的struts.xml文件分开,便于管理,故需要建立struts_user.xml文件管理请求等.那么需要用到inculde标签. ...
- [转]如何监测谁用了SQL Server的Tempdb空间
Tempdb 系统数据库是一个全局资源,供连接到 SQL Server 实例的所有用户使用.在现在的SQL Server里,其使用频率可能会超过用户的想象.如果Tempdb空间耗尽,许多操作将不能完成 ...