.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,改变聚集索引,提高查询性能的更多相关文章

  1. SQL Server-聚焦过滤索引提高查询性能(十)

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  2. SQL Server-聚焦过滤索引提高查询性能

    前言 这一节我们还是继续讲讲索引知识,前面我们讲了聚集索引.非聚集索引以及覆盖索引等,在这其中还有一个过滤索引,通过索引过滤我们也能提高查询性能,简短的内容,深入的理解,Always to revie ...

  3. SQL查询优化:详解SQL Server非聚集索引(转载)

    本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...

  4. T-SQL查询高级--理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤

      写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完.这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章 ...

  5. 但从谈论性能点SQL Server选择聚集索引键

    简单介绍 在SQL Server中,数据是按页进行存放的.而为表加上聚集索引后,SQL Server对于数据的查找就是依照聚集索引的列作为keyword进行了. 因此对于聚集索引的选择对性能的影响就变 ...

  6. SQL Server 非聚集索引的覆盖,连接,交叉和过滤 <第二篇>

    在SQL Server中,非聚集索引其实可以看做是一个含有聚集索引的表,但相对实际的表来说,非聚集索引中所存储的表的列数要少得多,一般就是索引列,聚集键(或RID).非聚集索引仅仅包含源表中的非聚集索 ...

  7. SQL Server的聚集索引和非聚集索引

    微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引)…… (一) ...

  8. SQL SERVER中非聚集索引的覆盖,连接,交叉,过滤

    1.覆盖索引:select和where中包含的结果集中应存在“非聚集索引列”,这样就不用查找基表了,索引表即可搞定:   2.索引交叉:索引的交叉可以理解成建立多个非聚集索引之间的join,如表实体一 ...

  9. SQL Server 百万级数据提高查询速度的方法

    1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...

随机推荐

  1. Ionic3 遇到的一些错误-submodule update -q --init --recursive

    解决方法: ionic start myTabs tabs --skip-deps cd .\myTabs cnpm install --save-dev ionic serve > npm i ...

  2. Python基础学习参考(一):python初体验

    一.前期准备 对于python的学习,首先的有一个硬件电脑,软件python的运行环境.说了一句废话,对于很多初学者而言,安装运行环境配置环境变量的什么的各种头疼,常常在第一步就被卡死了,对于pyth ...

  3. MVC架构下,使用NPOI读取.DOCX文档中表格的内容

    1.使用NPOI,可以在没有安装office的设备上读wiod.office.2.本文只能读取.docx后缀的文档.3.MVC架构中,上传文件只能使用form表单提交,转到控制器后要依次实现文件上传. ...

  4. H5定位

    百度地图javaScript API 一.在html文件中引入 <script src="http://api.map.baidu.com/api?ak=Uk9tDddYkrQImXw ...

  5. 如何在RHEL7上搭建Samba服务实现Windows与Linux之间的文件共享

    如何在RHEL7上搭建Samba服务实现Windows与Linux之间的文件共享 实现环境:VMware workstations.RHEL7.0 第一步:配置网卡IP及yum软件仓库 命令:vim ...

  6. eclipse中导入jsp等工程使用过程中常遇问题

    1.导入的工程JSP文件出现报错的情况 这个一般不怎么影响文件的执行,这些文件飘红主要是因为eclipse的校验问题. 具体错误信息:Multiple annotations found at thi ...

  7. C#中消息的工作流程

    C#中的消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体,窗体对象的第一个响应函数是对象中的protected override void WndProc(ref Sy ...

  8. c# asp.net 多数组索引的解决方法

    本人今天做了一个功能 需要在一个类里用多个数组, 数组需要索引器来调用  一个数组 我查了msdn 一个类里面只能有一个this 索引器 那这么多数组如何构造索引呢 我在坛子里找到了解决之道 view ...

  9. 在写一点关于MySQL的知识,感觉自己mmd

    DBMS(Database Management System)数据库管理系统  包括有DDL(数据定义语言)和DML(数据操纵语言)以及DCL(数据库控制语言) 数据库设计方法: 1.需求分析阶段 ...

  10. 设置Linux环境的欢迎登陆信息

    1.编辑/etc/profile文件添加如下内容: for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ &quo ...