HashJoin 会用两个输入中的较小输入建立内存中的散列表,然后读取较大的输入并探查内存中的散列表以查找匹配项,这些匹配项会被写入工作表中。如果内存无法容纳较小的输入,HashJoin 就会将这两个输入分为较小的工作表。将以递归的方式对这些较小的工作表进行处理,直到较小的输入能够装入内存为止。
HashJoin 还会执行以下操作:
在返回第一行之前计算其结果中的所有行
使用一个工作表,该工作表提供不敏感的语义(除非已请求对值敏感的游标)
以并行方式执行
在输入中的行被复制到内存之前,将这些行锁定
如果较小的输入能够装入内存,则无论较大输入的大小如何,HashJoin 的性能都将达到最佳。通常,如果其中一个输入将明显小于另一个输入,则优化程序就会选择散列连接。
如果 HashJoin 的运行环境中没有足够的高速缓存来保存其连接属性为特定值的所有行,HashJoin 将无法完成。在这种情况下,HashJoin 会放弃中间结果,而改用基于索引的 NestedLoopsJoin。较小表的所有行都将被读取并用来探查工作表以查找匹配项。这种基于索引的策略明显比其它连接方法慢得多,如果优化程序检测到在查询执行过程中可能会出现内存不足的情况,则它将避免使用散列连接生成访问计划。
HashJoin 运算符可以使用的内存量取决于服务器的进程并发水平和活动连接数。请参见SQL Anywhere 中的线程和设置数据库服务器的进程并发水平。
当由于内存不足而需要嵌套循环策略时,性能计数器将递增。您可以使用 QueryLowMemoryStrategy 数据库属性或连接属性读取此监控器,或者在 Windows 性能监控器的 [查询:或者在 Windows 性能监控器的 [查询:内存不足策略] 计数器中读取此监控器。
当内存不足时,将在 Windows Mobile 上禁用 HashJoin。
Windows Mobile 上可能未提供 Windows 性能监控器。
有关详细信息,请参见连接属性中的 QueryLowMemoryStrategy 和设置数据库服务器的进程并发水平。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |