原文发布时间为:2009-08-26 —— 来源于本人的百度文章 [由搬家工具导入]

总的考虑方向

1)        根据数据使用的方式来设计数据访问层

2)        缓存数据,避免不必要的操作

3)        使用服务帐户进行连接

4)        必要时连接,尽早释放

5)        关闭可关闭的资源

6)        减少往返

7)        仅返回需要的数据

8)        选择适当的事务类型

9)        使用存储过程

根据性能、可维护性、及实现难度来决定跨层数据传递的方式

2   具体实现

1)选用合适的Data Provider
应尽量使用专用的Data Provider,下面是一个性能比较表

由上图中可以看出SqlClient的速度是最快的,其主要原因是其他的数据提供者都经过的几个层次的转换,如下图

从图中可以看出,SqlClient直接访问DB Netlib而其他的数据提供者都经过了两层转换,因此,在设计多层应用的时候,并不是层次越多越好,而是应该在可扩展性与性能间取折中,增加层次是会降低性能的。

1)        数据库连接

                         i.              在方法中打开和关闭连接,即不要在类的构造函数中打开连接,在类的析构函数中关闭连接。

                       ii.              使用完连接明确地关闭。因为有连接池的支持,关闭连接只是将连接放回连接池,并不是真正销毁,不会带来性能开销,而会增加连接池中可用连接,提升性能。

                      iii.              当使用DataReaders时,指定CommandBehavior.CloseConnection

                     iv.              当使用Fill()与Updata()时,不要手动打开连接。因为DataAdapter会自动开启连接,但是如果是Command则需要手动开启。

                       v.              避免检查OleDbConnection的State属性,其性能开销相当大。

                     vi.              使用连接池。这种方法可以大幅度提高性能。默认的情况下,通过SqlClient连接数据库时,会使用连接池,另可以通过连接字符串来控制连接池的最大值,最小值,以及是否开启连接池。

2)        SQL指令

                         i.              检查SQL的输入,并使用参数,直接使用字符连接容易遭受注入式攻击。

                       ii.              仅返回需要的行和例

                      iii.              对大的数据集使用分页功能

                     iv.              批次执行SQL,避免多次往返。

                       v.              如果没有数据返回则使用ExecuteNonQuery方法

                     vi.              当返回一个标量时,使用ExecuteScalar方法

                    vii.              不要在运行时间使用CommandBuilder,尽管很省事,但是开销很大。

3)        存储过程

                         i.              尽量使用存储过程

                       ii.              对于OleDbCommand,指令类型为CommandType.Text

                      iii.              使用SqlCommand,指令类型为CommandType.StoredProcedure

                     iv.              尽可能使用输出参数

                       v.              考虑在SQL Server中SET NOCOUNT ON,即关闭SQL Server的记数功能。

4)        事务

5)        使用参数

                         i.              在存储过程上使用参数

                       ii.              创建参数并指定类型

                      iii.              可将参数对象进行缓存

6)        DataReader和DataSet

                        i.              DataReader对象需要关闭

                       ii.              用DataReader时应,使用CommandBehavior.CloseConnection关闭连接

                      iii.              DataReader应用在只读、只向前翻滚的数据访问场景

                     iv.              只想快速访问数据,不需要缓存功能应使用DataReader

DataSet在需要数据缓存,并在不同层间传递时使用。它可以存放多个结果集,可以在离线的情况下自由定位,查找数据。

总的来说,提高性能会降低可扩展性,以及维护难度,应在满足功能与非功能需求的情况下提高性能,另应在设计时就考虑性能,好的设计在性能上的提升比差的设计后期再修改要好得多。

SQL优化 ASP.NET ADO.NET的更多相关文章

  1. 读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF)

    读写分离子系统 - C# SQL分发子系统(ADO.NET,不支持EF) 这次介绍的这个框架只适用于中小项目,并且各个读写数据库结构是一致的情况,还要并且是写入数据库只有1台情况. 我们来看看这个子系 ...

  2. Sql 优化解决方案

    转自:https://blog.csdn.net/jie_liang/article/details/77340905 用以记录: 在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行 ...

  3. 城市经纬度 json 理解SignalR Main(string[] args)之args传递的几种方式 串口编程之端口 多线程详细介绍 递归一个List<T>,可自己根据需要改造为通用型。 Sql 优化解决方案

    城市经纬度 json https://www.cnblogs.com/innershare/p/10723968.html 理解SignalR ASP .NET SignalR 是一个ASP .NET ...

  4. SQL优化案例—— RowNumber分页

    将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...

  5. sql 优化

    1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...

  6. SQL 优化总结

    SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects         SELECT name as '函数名称',xtype as XType  FROM  s ...

  7. (转)SQL 优化原则

    一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...

  8. sql优化阶段性总结以及反思

    Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...

  9. mysql sql优化实例

    mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...

随机推荐

  1. spring MVC体系结构和请求控制器

    MVC处理过程 spring MVC架构模式都进行了分层设计如下 数据访问接口:DAO层 处理业务逻辑层:service层 数据实体:POJO 负责前端请求的接受并处理:servlet 负责前端页面展 ...

  2. 通用后台管理系统源码,响应式布局,Java管理系统源码,零门槛安装部署

    本项目是一个通用响应式管理后台,导入开发环境安装就能直接运行,界面也非诚漂亮,在PC端和移动端也是自适应的.非常适合企业或者个人搭建各种商城后台,博客后台,网站管理后台等. 源码启动后的截图 需要这套 ...

  3. Play on Words HDU - 1116 (并查集 + 欧拉通路)

    Play on Words HDU - 1116 Some of the secret doors contain a very interesting word puzzle. The team o ...

  4. linux命令行操作基本知识

    乱七八糟的命令 . 表示当前目录 .. 表示上一级目录 ls 显示文件 -l 列表 -a 隐藏文件 -h 文件大小人性化显示 gedit 自带文本编辑器 subl 打开sublime > 重定向 ...

  5. excel VBA 将文本数值转换为数字格式(单元格中数据左上角是绿三角,鼠标点上有叹号标示)

    Range("A6").SelectSelection.CopyRange("A10:A60").SelectRange(Selection, Selectio ...

  6. hdu3366 Count the string

    考虑dp[i]代表前缀s[1...i]出现的次数,必定有dp[nxt[i]] += dp[i] 倒着推就是了 #include <iostream> #include <cstrin ...

  7. 300万PV的ASP.NET网站使用阿里云的配置建议

    @老牛吃肉在博文“今天的访问高峰,扛过去了”的评论中询问了这样一个问题: 你好,站长,本公司正在考虑用阿里云.用途:互联网网站,主要站点:asp.net开发目前的考虑情况:访问ip 15-20万,pv ...

  8. python 学习分享-函数篇2

    递归 自己玩自己的函数: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少 3. 递归效率不高,递归层次过多会导致栈溢出 递归例子和二分查找都放在里面了 ...

  9. c++ 吕凤翥 第五章 类对象一

    一   类的声明和实现 1. class tdate   //声明部分 { public: void setdate(int y,int m,int d); int isleapyear(); voi ...

  10. Leetcode 648.单词替换

    单词替换 在英语中,我们有一个叫做 词根(root)的概念,它可以跟着其他一些词组成另一个较长的单词--我们称这个词为 继承词(successor).例如,词根an,跟随着单词 other(其他),可 ...