当SQL通过YACC或BISON等解析器转换为C时,那段翻译的C代码是否包含排序算法数学?我不明白如何在DBMS(如MySQL或Microsoft SQL Server)中实现排序 - 是语法分析器的算法部分吗?或者,算法是仅在从SQL查询中获取数据后才应用于结果数据组,而不是直接应用于计算机内存?或者排序算法是否为ISO标准,并且所有DBMS都需要使用相同的算法?
我做了我的研究和谷歌搜索,但没有找到明确的答案。如果没有不必要地阅读有关数据库内部的书籍,有人可以清楚地解释这个概念吗?
答案 0 :(得分:4)
SQL标准不包含有关如何进行排序的任何规范。当您使用order by
发出查询时,数据库有责任以指定的顺序返回结果,但每个数据库都可以自由地实现此功能,但它认为合适。
答案 1 :(得分:2)
排序算法肯定不是语法分析器的一部分,它在技术上是'实现细节'。但这是一个相当重要的因素,因为它可以从根本上影响复杂查询的性能。然而,术语'实现细节'指的是由DBMS供应商决定做什么以及如何做。
它甚至可以部分委托给查询优化器,因为像heapsort,mergesort,quicksort等常见的排序算法都有不同的“最佳案例场景”。有些在“大多数排序数据”上表现得更好,而其他人在“非常未排序的数据”上表现得非常慢。由于索引可能包含提示,因此非常智能的DBMS甚至可以根据手头的数据see this Wikipedia writeup for a comparison选择不同的排序算法。据我所知,目前的供应商都没有这样做。
所以最后,从程序员的角度看,只是一个黑盒子时使用了什么排序算法。您(应该)关心的是输出正确。
答案 2 :(得分:1)
与许多事情一样,这取决于。
ISO标准定义的是,当请求排序顺序时,它会以特定方式受到尊重。满足该标准的机制取决于实施。话虽如此,近半个世纪以来,排序已经成为一个经过深入研究的计算分支,并且有少量算法可以很好地运行,加上微小的变化就可以进行微调。
LEXX,YACC和BISON除了提供他提供的代码的意图之外没有做太多。您可以在提供的代码中识别名词,谓词和谓词,但在将输出传递给某种解释器之前,输出实际上并没有做任何事情。
在RDBMS中,隐藏在解析器和词法分析器下的解释器接受那些名词,谓词和动词,并计算数据的理想访问路径,同时考虑平台的优化(专有或非专有)。访问路径作为动词列表执行。
但是,口译员不一定是RBMS。它可能是管理元数据的工具,在这种情况下,结果可能是实体关系的图形图像(作为示例)。
大多数数据库使用多种不同的排序算法,具体取决于它们的排序方式,以及它们应用排序的信息生命周期的哪个阶段。
从批量数据创建有序索引时,它们可能使用树排序或堆排序。
选择数据时,第一个选择是选择允许遍历索引的访问路径,该索引自然地按照您请求的顺序返回数据(即避免排序)。
如果数据集必须在检索后进行排序,并且它足够小以适应内存,它们通常会使用某种类型的QuickSort。
如果数据集必须在检索后进行排序,并且它太大而无法放入内存中,则它们可能会创建一个临时表并使用堆排序或树排序。
我希望这会有所帮助。