引自: http://blog.youkuaiyun.com/21aspnet/archive/2009/01/05/3712984.aspx
能用 DataReader 就不要用 DataSet / DataTable,前者读取速度快又不耗内存;后者虽较有弹性,但速度较慢又会每个使用者消耗许多内存。若您连 DropDownList 控件的数据来源,都用 SqlDataSource 控件的默认值 - DataSet,则当页面里塞了一堆下拉选单时,性能当然会受影响。
但前提是程序员对 ADO.NET 要有一定程度的了解,若只会用 Visual Studio 透过图形界面,拖拉 TableAdapter、DataTable、.xsd 就免谈了。
若为 DataTable 建立 Primary Key,DataTable 会建立一个索引,追踪新增到 DataTable 中的数据是否符合此条件约束 (constraint)。ADO.NET 2.0 会使用 algorithm 的「红黑树算法 (Red-Black Tree,是一种「平衡树」算法) 去处理索引,让 DataTable 的数据量大时,较方便维护索引;但缺点是建立索引时会降低一些性能。
此外,数据库的访问和捞值,应该尽量在一次 DB connection 做完,一个 connection 可搭配多个 DbCommand 对象使用,不用每次都一个 DbConnection 配一个 DbCommand。
在此推荐一本不错的 ADO.NET 原文书:
Programming Microsoft ADO.NET 2.0 Core Reference:
http://www.amazon.com/Programming-Microsoft%C2%AE-ADO-NET-Core-Reference/dp/073562206X/ref=sr_1_1?ie=UTF8&s=books&qid=1230971264&sr=1-1
有探讨许多市面上书籍少见的深入内容,像 Oracle + ADO.NET 的各种应用、Connection Pooling 的特性、各种的数据库 Balk (批次) 作业应用。
数据库「事务 (Transaction)」
您是否知道 SQL Server 的默认「事务隔离等级 (Isolation Level)」,是「ReadCommitted」,当您在写 ADO.NET 用了 SqlTransaction 时,默认是当某个人在修改某一笔记录时,其它所有读取这一笔记录的人,都会被「锁定 (lock)」住,造成其它全部用户的浏览器都在等待中,无法做其它工作。
而 Oracle 事务的特性,是绝不会有类似无法读取的情形,至少会用类似 SQL Server 2005 新增的「快照隔离 (Snapshot Isolation)」,让用户至少能先读取到未 Commit 或 Rollback 的记录,而不用呆坐在浏览器前面傻等。
不过 SQL Server 2005 的「快照隔离」默认未启用。用 SQL Server 开发的系统,若怕用户被锁定的问题,可视 project 需求,改用最宽松的「ReadUncommitted」事务隔离等级,其特性为不会造成任何锁定,但可能会造成 Dirty Read。SQL Server 有下列七种「事务隔离等级」,有兴趣的网友可去查询 ADO.NET 书籍或 MSDN Library:
Chaos
ReadCommitted // SQL Server 默认值
ReadUncommitted // 最宽松,会有 Dirty Read
RepeatableRead
Serializable // 最严,会有大量的锁定
Snapshot
Unspecified