SQL Server排序算法

问题描述 投票:16回答:4

排序算法很多,但是我想知道当我们使用Order by而没有Order by时在SQL Server中使用哪种算法。

sql-server sorting
4个回答
2
投票

如果不使用ORDER BY,则没有隐含或自然顺序。所以没有算法。这适用于大多数RDBMS。只有ORDER BY可以给出结果的任何顺序。

当您使用ORDER BY时,它将遵循您指定的列列表,asc / desc,排序规则,表达式等。我能想到的唯一不直观的规则是列的“ NULL优先”,但在SQL Server中排序很简单。


2
投票

是的,Elzo是正确的,SQL Server(和许多其他RDBMS)使用几种不同且复杂的排序算法。他们旨在在内存使用率,平均响应时间之间保持平衡,同时保持高水平的资源并发性。在某些情况下,算法选择取决于所涉及的数据类型,要排序的数据大小或指定的排序键数,等等。

引用此线程:What algorithms does SQL use?


2
投票

我想这取决于您选择订购BY的列。 If是整数,是与字符串不同的算法。另一个猜测是该列是否具有索引也将至关重要。

这是algorithm for text order by in Mysql

原始文件排序算法有效如下所示:根据键或通过表扫描。行与WHERE子句不匹配的是跳过了。对于每一行,存储一对缓冲区中的值(排序键和行指针)。的大小缓冲区是值sort_buffer_size系统变量。什么时候缓冲区已满,运行qsort(快速排序)并存储结果在一个临时文件中。保存一个指向排序的块。 (如果所有对都适合进入排序缓冲区,没有临时文件已创建。)重复上述步骤步骤,直到读取了所有行。最多合并MERGEBUFF(7)区域到另一个区域临时文件。重复直到全部第一个文件中的块位于第二个文件。重复以下步骤直到少于MERGEBUFF2(15)个街区。在最后多次合并,仅指向行(排序键的最后一部分)是写入结果文件。阅读使用行按排序顺序排列行结果文件中的指针。至优化这一点,我们大篇幅地阅读行指针,对其进行排序,然后使用他们按排序顺序读取行放入行缓冲区。的大小缓冲区是值read_rnd_buffer_size系统变量。此步骤的代码在sql / records.cc源文件。


-1
投票

SQL Server使用两种不同的排序逻辑来处理排序!第一个是快速排序,另一个是合并排序。它开始使用“快速排序”算法在内存中进行排序,但请注意,此操作的内存要求至少为其输入行大小的200%。现在,如果超出了内存授予权限(即使只有一个字节),它就会将整个立即排序溢出,并将剩余的排序溢出到磁盘上。然后它将使用“合并排序”算法完成磁盘上的排序。


推荐问答