HashDistinct 采用单个输入并返回所有非重复行。HashDistinct 通过读取其输入并建立内存中的散列表来实现此目的。如果在散列表中找到某一输入行,将忽略该输入行;否则,该输入行将被写入工作表中。如果输入不能完全装入内存中的散列表,则会将其分割为多个较小的工作表,并以递归方式进行处理。
HashDistinct 还会执行以下操作:
如果非重复行能够装入内存中的表,则该算法会非常顺利地执行,而与输入中的总行数无关。
使用一个工作表,因此可以提供不敏感的语义或对值敏感的语义。
找到以前没有返回的行时,返回该行。但是,必须完全实现非重复散列的结果后,才能从查询返回。如果必要,优化程序将为执行计划添加一个工作表以确保实现此目标。
会锁定其输入的行。
如果优化程序检测到在查询执行过程中可能会出现内存不足的情况,它将避免使用非重复散列算法生成访问计划。如果 HashDistinct 的运行环境中的可用高速缓存极少,该算法将无法完成。在这种情况下,HashDistinct 会放弃中间结果,而改用内部内存不足方法。
HashDistinct 运算符可以使用的内存量取决于服务器的进程并发水平和活动连接数。请参见SQL Anywhere 中的线程和设置数据库服务器的进程并发水平。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |