惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
L
LINUX DO - 热门话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
V
V2EX
GbyAI
GbyAI
量子位
Microsoft Azure Blog
Microsoft Azure Blog
有赞技术团队
有赞技术团队
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
B
Blog
Microsoft Security Blog
Microsoft Security Blog
S
SegmentFault 最新的问题
O
OpenAI News
N
News and Events Feed by Topic
博客园 - Franky
爱范儿
爱范儿
Forbes - Security
Forbes - Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V2EX - 技术
V2EX - 技术
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Schneier on Security
Schneier on Security
Cloudbric
Cloudbric
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Recent Commits to openclaw:main
Recent Commits to openclaw:main
人人都是产品经理
人人都是产品经理
P
Privacy International News Feed
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
Last Week in AI
Last Week in AI
罗磊的独立博客
Spread Privacy
Spread Privacy
Recent Announcements
Recent Announcements
The Cloudflare Blog
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
The Register - Security
The Register - Security
Y
Y Combinator Blog
J
Java Code Geeks
I
Intezer

博客园 - epan

www.smallsocial.com 一晃眼这个blog已经丢弃两年。。。 自动调节img宽度的脚本 寻找开源的P2P视频点播系统 为什么vs2005内置Web application server中调用COM组件时正常,在IIS中运行时组件创建失败? 请教vs2005中单元测试时测试一个返回对象的方法应该怎么做? - epan - 博客园 XML节点存在namespace(xmlns)的时候xpath不能正常工作 用ASP.NET缓存提高站点性能【转载】 ADO.NET实用经验无保留曝光 (四)【转载】 ADO.NET实用经验无保留曝光 (三)【转载】 ADO.NET实用经验无保留曝光(一)【转载】 使用MasterPage遇到的问题 - epan - 博客园 在VS.NET2003中无法新建C#项 最近迷上了淘宝,好像真的有免费的午餐一样。。。 Where to go??? 《鬼谷子》 鬼谷子本经阴符七术 《老子》 我又做了一件不可思议的事。。。
ADO.NET实用经验无保留曝光 (二)【转载】
epan · 2006-07-08 · via 博客园 - epan

在DataSet中搜索数据   在DataSet中查询与特定条件相匹配的行时,可以利用基于索引的查找提高搜索性能。当将PrimaryKey值赋给DataTable时,会创建一个索引。当给DataTable创建DataView时,也会创建一个索引。下面是一些利用基于索引进行查找的技巧。

  1) 如果对组成DataTable的PrimaryKey的列进行查询,要使用DataTable.Rows.Find而不是DataTable.Select。

  2) 对于涉及到非主键列的查询,可以使用DataView为数据的多个查询提高性能。当将排序顺序应用到DataView时,就会建立一个搜索时使用的索引。DataView公开Find和FindRows方法,以便查询基础DataTable中的数据。

  3) 如果不需要表的排序视图,仍可以通过为DataTable创建DataView来利用基于索引的查找。注意,只有对数据执行多个查询操作时,这样才会带来好处。如果只执行单一查询,创建索引所需要的处理就会降低使用索引所带来的性能提升。

  DataView构造

  如果创建了DataView,并且修改了Sort、RowFilter或RowStateFilter属性,DataView就会为基础DataTable中的数据建立索引。创建DataView对象时,要使用DataView构造函数,它用Sort、RowFilter和RowStateFilter值作为构造函数参数(与基础DataTable一起)。结果是创建了一次索引。创建一个“空”DataView并随后设置Sort、RowFilter或RowStateFilter属性,会导致索引至少创建两次。

  分页

  ADO.NET可以显式控制从数据源中返回什么样的数据,以及在DataSet中本地缓存多少数据。对查询结果的分页没有唯一的答案,但下面有一些设计应用程序时应该考虑的技巧。

  1) 避免使用带有startRecord和maxRecords值的DataAdapter.Fill重载。当以这种方式填充DataSet时,只有maxRecords参数(从startRecord参数标识的记录开始)指定的记录数量用于填充DataSet,但无论如何总是返回完整的查询。这就会引起不必要的处理,用于读取“不需要的”记录;而且为了返回附加记录,会耗尽不必要的服务器资源。

  2) 用于每次只返回一页记录的技术是创建SQL语句,将WHERE子句以及ORDER BY子句和TOP谓词组合起来。此技术取决于存在一种可唯一标识每一行的办法。当浏览下一页记录时,修改WHERE子句使之包含所有唯一标识符大于当前页最后一个唯一标识符的记录。当浏览上一页记录时,修改WHERE子句使之返回所有唯一标识符小于当前页第一个唯一标识符的记录。两种查询都只返回记录的TOP页。当浏览上一页时,需要以降序为结果排序。这将有效地返回查询的最后一页(如果需要,显示之前也许要重新排序结果)。

  3) 另一项每次只返回一页记录的技术是创建SQL语句,将TOP谓词和嵌入式SELECT语句的使用结合在一起。此技术并不依赖于存在一种可唯一标识每一行的办法。使用这项技术的第一步是将所需页的数量与页大小相乘。然后将结果传递给SQL Query的TOP谓词,该查询以升序排列。再将此查询嵌入到另一个查询中,后者从降序排列的嵌入式查询结果中选择TOP页大小。实质上,返回的是嵌入式查询的最后一页。例如,要返回查询结果的第三页(页大小是10),应该书写如下所示的命令:

SELECT TOP 10 * FROM   [转自:51item.net]  
(SELECT TOP 30 * FROM Customers ORDER BY Id ASC) AS Table1
ORDER BY Id DESC

  注意:从查询中返回的结果页以降序显示。如果需要,应该重新排序。

  1) 如果数据不经常变动,可以在DataSet中本地维护一个记录缓存,以此提高性能。例如,可以在本地DataSet中存储10页有用的数据,并且只有当用户浏览超出缓存第一页和最后一页时,才从数据源中查询新数据。

  用架构填充DataSet

  当用数据填充DataSet时,DataAdapter.Fill方法使用DataSet的现有架构,并使用从SelectCommand返回的数据填充它。如果在DataSet中没有表名与要被填充的表名相匹配,Fill方法就会创建一个表。默认情况下,Fill仅定义列和列类型。

  通过设置DataAdapter的MissingSchemaAction属性,可以重写Fill的默认行为。例如,要让Fill创建一个表架构,并且还包括主键信息、唯一约束、列属性、是否允许为空、最大列长度、只读列和自动增量的列,就要将DataAdapter.MissingSchemaAction指定为MissingSchemaAction.AddWithKey。或者,在调用DataAdapter.Fill前,可以调用DataAdapter.FillSchema来确保当填充DataSet时架构已到位。

  对FillSchema的调用会产生一个到服务器的额外行程,用于检索附加架构信息。为了获得最佳性能,需要在调用Fill之前指定DataSet的架构,或者设置DataAdapter的MissingSchemaAction。

  使用CommandBuilder的最佳实践

  假设SelectCommand执行单一表SELECT,CommandBuilder就会以DataAdapter的SelectCommand属性为基础自动生成DataAdapter的InsertCommand、UpdateCommand、和DeleteCommand属性。下面是为获得最佳性能而使用CommandBuilder的一些技巧。

  1) CommandBuilder的使用应该限制在设计时或即席方案中。生成DataAdapter命令属性所必需的处理会影响性能。如果预先知道INSERT/UPDATE/DELETE语句的内容,就显式设置它们。一个比较好的设计技巧是,为INSERT/UPDATE/DELETE命令创建存储过程并显式配置DataAdapter命令属性以使用它们。

  2) CommandBuilder使用DataAdapter的SelectCommand属性确定其他命令属性的值。如果DataAdapter的SelectCommand本身曾经更改过,确保调用RefreshSchema以更新命令属性。

  3) 如果DataAdapter命令属性为空(命令属性默认情况下为空),CommandBuilder仅仅为它生成一条命令。如果显式设置了命令属性,CommandBuilder不会重写它。如果希望CommandBuilder为以前已经设置过的命令属性生成命令,就将命令属性设置为空。

  批处理SQL语句

  很多数据库支持将多条命令合并或批处理成一条单一命令执行。例如,SQL Server使您可以用分号“;”分隔命令。将多条命令合并成单一命令,能减少到服务器的行程数,并提高应用程序的性能。例如,可以将所有预定的删除在应用程序中本地存储起来,然后再发出一条批处理命令调用,从数据源删除它们。
虽然这样做确实能提高性能,但是,当对DataSet中的数据更新进行管理时,可能会增加应用程序的复杂性。要保持简单,可能要在DataSet中为每个DataTable创建一个DataAdapter。