与模糊查找相比,模糊分组需要调整的外部参数较少,不过,了解它的一些内部机制会帮助您获得非常好的性能。模糊分组在后台使用模糊查找来执行分组。 例如,模糊分组将其标记化的字符串原封不动地传递给模糊查找。 在运行时,模糊分组依据输入数据使用模糊查找创建一个临时 ETI,并用其确定哪些输入行是彼此相近的。模糊分组检查每个输入行,并对数据执行多种模糊查找查询,同时自适应地设置 MinSimilarity 阀值。 依据得回的结果数,由它生成组。
正如使用模糊查找,模糊分组要求您设置 MinSimilarity 阀值。 只有元组彼此的相似性高于在 UI 中设置的阀值时,它们才会被分组,记住这一点是很重要的。 因此,如果您用一个低阀值运行模糊分组并发现很不近似的元组被分组到一起,那么就提高相似性设置。模糊分组将每个元组的相似性报告给该组的代表元组。 代表元组的选择是无法影响的。 如果您想要拆分一个组,将所需的相似性设置为高于报告数。 如果被分组的元组过少,您可以对相似性值执行一个二进制搜索,以确定为对某些元组进行分组,将相似性阀值设置为多低合适。 例如,如果设置为 0.9 导致组太少,而 0.7 导致组太多,那么试一下 0.8.
注 是无法强制模糊分组对两个元组分组的。 即使将相似性设置为零也不一定会返回带有所有元组的一个单个组。 因为组的质量极大地取决于您的数据的特定语义,所以试验是找出您的应用程序的正确设置的唯一方法。
您还可以尝试使用模糊查找为您的输入数据创建一个 ETI,并通过使用一个大值以返回该数量的匹配和高阀值以达到所需的相似性,来查找特定的行。 不过,模糊分组合并了以下两项内容:将元组适当地归类为多个重复项的集合的附加智能及使代表规范化的建议。
了解性能
尽管其界面简单,但模糊查找和模糊分组是复杂的过程,了解其性能需要一些分析。 下列各节解释了常见性能问题并提供了一些措施的示例。 正如您将要看到的,模糊查找和模糊分组性能的主要决定因素是数据大小。 对于模糊查找和模糊分组来说,这是指输入行、标记和字节的数量。 对于模糊查找,还有关于引用数据大小的附加注意事项。 次要的决定因素是可用的计算资源,包括内存、数据库服务器上的空间、网络带宽,以及设置这些资源的方法。
设置注意事项
要从模糊查找和模糊分组获得非常好的性能,遵循关于内存使用和体系结构的一些原则是很有用处的。
要将在您计算机上的内存要求最小化:
使用更轻量的 DTExec.exe 而非完整的 DTS 设计器来在生产中执行包。
去除您管道中未使用的列,因为其需要内存。
避免在输入中使用长 varchar 列,因为它们由 DTS 管道转换为固定宽度的 char 列。
通过限制 varchar 字段的转换,将所有数据传递到长度与列中最长的项相等的固定长度 char 字段。
如果您选择在同一台计算机上运行 DTS 客户端和服务器,您将会避免潜在的网络问题,但是可能遇到内存争用。 您可以使用 sp_configure 并将 set max server memory 设置设为 256 以减轻两个进程之间的内存争用。 您还可以使用 DTS 设计器中的高级编辑器设置 MaxMemoryUsage Fuzzy Lookup 自定义属性。
在以下各节中报告的所有实验趋势线都是使用下列设置获得的:
一台有 Intel Pentium III 1 千兆赫 (GHz) 处理器的服务器、 512 兆字节 (MB) 的 RAM,以及 Microsoft Windows Server 2003 企业版。
与 DTS 客户端运行在同一台机器上的 SQL Server.
对于反复出现的其引用表比通常的输入表大很多的模糊查找任务,您应该考虑预计算索引。 在这些情况下,重新创建索引会在实际查找所花费的运行时间中占支配地位,而这使得管理附加表非常值得。
对于大的模糊查找输入任务,您可能想要考虑将多个 DTS 客户端与一台中央服务器一起使用。 在这个设置中,此中央服务器承载引用表和预计算的 ETI. 通过使用中央引用表和 ETI,每个 DTS 客户端对该大输入表任务的一部分执行模糊查找。 当模糊查找完成后,您重新合并由各个 DTS 客户端生成的所有输出表。
注 这个体系结构不适用于模糊分组。
措施
对模糊查找和模糊分组性能的最大影响来自于所使用数据的大小。 在模糊查找中,这是指引用和输入表的大小。 在模糊分组中,这是指输入表的大小。 输入的大小与两个方面有关系:
行和列的数量对性能有最大的影响。 您有的数据越多,模糊查找和模糊分组所需要的资源就越多。 以下各节中的数字展示了不同方案下的特定数据。
每个模糊匹配在其上执行的字符串列的平均标记数也对性能有影响。 模糊转换并不意味着文档检索。 对于较长的字段(多于 20 个标记),使用 SQL Server 全文索引功能可能会更有效率。
以下各节展示了一些详细的模糊查找和模糊分组性能图表。 这些图表旨在建议转换的趋势,而不是给出绝对数字。 一些图表表达对一个基准度量值增加或减少的比例。 在这些情况下,该图表能够被用于粗略推断多大的输入大小增长会导致运行时间的加倍。
模糊查找性能
决定模糊查找性能的两个主要变量是引用数据的大小和输入数据的大小。 这些变量与模糊查找的两个阶段对应: 创建 ETI 和实际执行查找。 总的来说,这些任务在其各自的输入大小上是线性变化的。 取决于您的输入的大小,实际的查找时间可能少于或多于 ETI 创建时间。
图 3 说明了与引用表大小相对的创建 ETI 所需的时间。 如前面所解释的,创建 ETI 可以执行一次并将结果保存,从而避免每次都因为创建造成开销。 由此得到的 ETI 的大小最高是索引引用列的大小的两倍。 注意一些 DTS 管道计数器在创建大型 ETI 的时候可能看来是冻结的。 您可以通过观测服务器上表的增长来跟踪进展。
![]() |
ETI 的大小也影响运行时间。 ETI 包含的数据越多,它的使用就越昂贵,因为这表示需要更大的搜索空间。 图 4 说明了与固定输入大小的引用表大小相对的模糊查找的运行时间性能。 图 4 中的曲线也取决于对在查找时间中扮演重要角色的不同行的标记分布。 有更多内存的话能够减轻大的引用表和 ETI 的影响。 在运行时,模糊查找将部分 ETI 缓存在内存里,其值最高等于 MaxMemoryUsage 自定义属性中指定的约束大小。 必须使用高级编辑器来设置这个限制。
![]() |
排在数据大小对性能的影响之后,对性能的最大影响来自于剩下的转换参数,如要返回的匹配数、所需的相似性阀值,以及对其进行匹配的列的数量。
要求模糊查找返回的匹配越多,搜索就越慢。 这是因为会连续搜索到候选元组的列表中,直至找到足够的匹配。
要求的相似性因子越大,模糊查找搜索就越快。 这是因为在要求高相似性的搜索中,模糊查找更积极地放弃元组。
模糊分组性能
模糊分组比模糊查找依赖的变量更少。 影响模糊分组性能的主要变量是输入数据大小。 图 5 展示了当输入数据变大后,成本变化呈线性。 图表前面部分的非线性是由于 ETI 的创建时间。 随着匹配阀值的增大,因为找不到相似的元组来创建分组,执行时间最终会减小。 这显示在图 6 中。图 6 展示出数据的分布扮演了重要角色,而且可能导致运行时间的一些非线性变化。 要注意的是,运行大的模糊分组任务,会导致您指定作为临时连接的服务器上的临时对象也很大。 在模糊分组预处理步骤中,DTS 管道可能看来是冻结的。 如果发生这种情况,您可以通过观测服务器上临时对象的大小来跟踪进展。
![]() |
![]() |
小结
模糊查找和模糊分组转换是独立于域的基元,可以有助于数据清理和准备。 它们采用基于标记的距离概念 — 您可用于对您的数据执行细致的查找和分组操作。 关于距离函数和该组件的整体体系结构的进一步的详细信息,可以在下面引用的研究论文中找到。 因为模糊查找和模糊分组是作为 DTS 组件实现的,您可以在较大的 ETI 过程中透明地使用它们,并利用 DTS 基础结构,如日志记录、事件和错误跟踪,无须使用自定义编程,从而避免了相关费用。 尽管需要一些资源来计算转换,但模糊查找和模糊分组将曾几何时、不用大量手动干预和自定义工具就难于完成或无法完成的操作自动化了。
