排序将其输入信息读入内存中,在内存中对输入信息进行排序,然后输出结果。如果输入的信息不能完全装入到内存中,则将按顺序分多个步骤运行,然后将它们合并在一起。排序不返回任何行,直到它读取了所有的输入行。排序会锁定其输入行。
如果排序的运行环境中的可用高速缓存极少,该算法可能会无法完成。在这种情况下,排序将使用基于索引的排序方法对其余输入进行排序。它会读取输入行并将其插入到工作表中,而且会在工作表的排序列上建立索引。在这种情况下,将使用复杂的索引扫描从工作表中读取行。这种基于索引的策略要慢很多。如果优化程序检测到在查询执行过程中可能会出现内存不足的情况,它将避免使用排序生成访问计划。当由于内存不足而需要使用基于索引的策略时,性能计数器将递增;可以使用 QueryLowMemoryStrategy 属性或者在 Windows 性能监控器的 [查询:内存不足策略] 计数器中读取此监控器。
排序运算符可以使用的内存量取决于服务器的进程并发水平和活动连接数。请参见SQL Anywhere 中的线程和设置数据库服务器的进程并发水平。
排序关键字的大小、行大小和输入信息的总大小都会影响排序性能。对于较大的行,使用 VALUES SENSITIVE 游标的开销可能会低一些。在这种情况下,SELECT 列表中的行不会被复制到排序所使用的工作表中。虽然排序不会将输出行写到工作表中,但是必须在实现排序的结果后,才能将行返回到应用程序。如果必要,优化程序将添加一个工作表以确保实现该目标。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |