提高自定义应用程序的搜索效率

 

上一次修改主题: 2005-05-06

下面几部分推荐了在创建自定义的客户端应用程序时可以使用的技术。这些建议指出了要使用的 SQL 结构和要避免的 SQL 结构,并说明了如何提高使用 HTTP/DAV 请求的搜索的效率。

有关在自定义应用程序中使用搜索请求的详细信息,请参阅 Exchange Server 2003 SDK中的“Search”主题(英文)。

避免使用 SELECT * SQL 语句

一旦可能,请使用诸如 SELECT <所需属性> 这样的 SQL 表达式,而不要使用 SELECT *。Exchange Server 2003 使用 SELECT * 执行搜索时,Exchange Server 2003 将检查目标项的架构,以识别要返回的属性集。

检查架构会增加请求的处理开销,并占用了处理搜索请求所需的大部分开销。

通过使用 SELECT <所需属性> 语句,可以避免执行架构检查,并且请求只返回应用程序所需的属性。这样便可以更高效地执行后续处理。

避免在 SQL 语句中使用 Where 子句

请使用不同的技术来缩小搜索范围,而不要在 SQL 表达式中包括 WHERE 子句。删除 WHERE 子句可以减少处理搜索请求时的开销,并减少事务日志大小的增加量。例如,在某个示例中,用 WHERE 子句来获得所有未读邮件,那么,可以先获得全部已读和未读邮件,然后删除所有已读邮件,以提高处理效率。

但是,应注意在什么情况下可以使用此方法。对于结果集大小根据是否包括 WHERE 子句而变化极大的搜索来说,此方法不那么有效。

对 HTTP/DAV 搜索使用 PropFind

如果使用 HTTP/DAV Search 语句或 ADO SQL 语句来进行搜索,可能能够使用 HTTP/DAV PropFind 方法来执行搜索。使用 PropFind 时,可以从 Exchange Server 2003 邮箱服务器或公用文件夹服务器上移走部分搜索处理负载,并减小搜索对事务日志大小的影响。

如果决定使用 PropFind,尤其是如果要修改现有的应用程序,应全面地测试此解决方案,以确保结果和性能影响符合预期的要求。

PropFind 方法具有下列优点:

  • 可以抑制事务日志大小增加。
  • 可以很容易地在 Exchange 服务器与其他应用程序服务器之间分布负载。Exchange 服务器上的负载仅用于 PropFind 请求本身,而相关的任务(例如,对用户进行身份验证、创建视图,以及处理 XML 结果集)由应用程序服务器执行。

但是,PropFind 方法也具有下列缺点:

  • 没有 SQL WHERE 子句的等价项。当处理 XML 结果集时,需要实现一个等效的功能。有关详细信息,请参阅本章后面的“PropFind 搜索的示例 XML 代码”。
  • 网络负载可能增加。如果有大量的数据在 Exchange 服务器与应用程序服务器之间来回传递,可能需要确保这些服务器是通过高容量网络连接在一起的。
  • 如果应用程序已经建立,则很难再加入此方法。

PropFind 搜索的示例 XML 代码

以下示例 XML 代码说明了可以怎样使用 PropFind。不需要使用 WHERE 子句,即可使用 XSL 从结果集中提取未读邮件。

note注意:
此示例代码不包括所有 DAV 头。
<?xml version='1.0'?>
<d:propfind xmlns:d='DAV:'
            xmlns:h='urn:schemas:httpmail:'
            xmlns:e='https://schemas.microsoft.com/exchange/'>
   <d:prop>
      <d:href />
      <d:displayname />
      <h:subject />
      <h:sendername />
      <d:creationdate />
      <h:read />
   </d:prop>
</d:propfind>

搜索范围对性能的影响

搜索既可以有浅范围(也称为浅遍历),也可以有深范围(也称为深遍历)。浅搜索指的是范围仅限于一个文件夹或一组特定文件夹的搜索。深搜索指的是范围包含某个文件夹及其所有子文件夹的搜索。

文件夹层次结构的深度以及文件夹的大小决定了深遍历搜索的性能是否优于多个浅遍历搜索的性能。当运行深遍历搜索时,Exchange Server 2003 必须锁定文件夹层次结构,以防止它在搜索过程中发生改变。此约束可能会影响需要访问这些文件夹的其他操作。但是,多个浅遍历搜索所需的处理时间比深遍历搜索所需的时间稍长,因为 Exchange Server 2003 使用 Active Server Pages (ASP) 来创建连续的 SQL 语句。要优化搜索的性能,尤其是如果要构建自定义应用程序,应使用测试拓扑来模拟文件夹层次结构的复杂度以及所预计的使用负载。使用测试结果可以确定哪一种搜索类型最适合您的环境。

无论是深遍历搜索还是浅遍历搜索,处理时间都随着搜索的文件夹数目的增加而增加。

note注意:
如果只需要文件夹及其子文件夹的属性,则可以使用第三个作用域类型(分级遍历),而不使用深度遍历。由于层次结构遍历搜索仅仅返回属性,因此它的执行速度比同等的深遍历搜索要快。

如果除了指定搜索范围以外还使用自定义应用程序来明确地创建搜索文件夹,则也可以提高搜索性能。如果搜索请求存在明确创建的文件夹,则 Exchange Server 2003 在处理搜索时不必创建文件夹。如果要缩小复杂搜索请求的搜索结果集,此方法可能尤其有效。