Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database DBMS如何实现自己的排序算法?还是他们?_Database_Sorting_Rdbms_Conceptual - Fatal编程技术网

Database DBMS如何实现自己的排序算法?还是他们?

Database DBMS如何实现自己的排序算法?还是他们?,database,sorting,rdbms,conceptual,Database,Sorting,Rdbms,Conceptual,当一个SQL被诸如YACC或BISON这样的解析器翻译成C时,翻译后的C代码是否包含排序算法?我不明白排序是如何在DBMS(如MySQL或Microsoft SQL Server)中实现的——算法是语法分析器的一部分吗?或者,该算法是否仅在从SQL查询获取结果数据组后才应用于该数据组,而不直接应用于计算机内存?还是排序算法是ISO标准,所有DBM都需要使用相同的算法 我做了调查和谷歌搜索,但没有找到明确的答案。如果没有不必要地阅读一本关于数据库内部的书,有人能清楚地解释一下这个概念吗?SQL标准

当一个SQL被诸如YACC或BISON这样的解析器翻译成C时,翻译后的C代码是否包含排序算法?我不明白排序是如何在DBMS(如MySQL或Microsoft SQL Server)中实现的——算法是语法分析器的一部分吗?或者,该算法是否仅在从SQL查询获取结果数据组后才应用于该数据组,而不直接应用于计算机内存?还是排序算法是ISO标准,所有DBM都需要使用相同的算法


我做了调查和谷歌搜索,但没有找到明确的答案。如果没有不必要地阅读一本关于数据库内部的书,有人能清楚地解释一下这个概念吗?

SQL标准没有任何关于如何进行排序的规范。当您以的顺序发出查询时,数据库有责任按照指定的顺序返回结果,但每个数据库都可以自由地执行它认为合适的操作。

排序算法肯定不是语法分析器的一部分,从技术上讲,它是一个“实现细节”。这是一个相当重要的问题,因为它可以从根本上影响复杂查询的性能。然而,术语“实现细节”指的是由DBMS供应商决定做什么以及如何做

它甚至可以部分委托给查询优化器,因为常见的排序算法(如heapsort、mergesort、quicksort等)都有不同的“最佳情况场景”。有些在“大部分排序的数据”上表现得明显更好,而另一些在“非常未排序的数据”上表现得非常慢。因为索引可能包含关于非常智能的DBMS甚至可以根据手头的数据选择不同的排序算法的提示。据我所知,目前的供应商都没有这样做


最后,从程序员的角度来看,当只是一个黑盒子时,会使用什么排序算法呢。您(应该)关心的是输出是否正确排序。

在很多事情上,这取决于具体情况

ISO标准所定义的是,当请求排序顺序时,它以特定方式得到遵守。达到该标准的机制取决于执行情况。尽管如此,近半个世纪以来,排序一直是计算的一个重要研究分支,已知有少量算法运行良好,加上相当于微调的微小变化

LEXX、YACC和BISON除了提取他提供的代码的意图之外,没有做什么。您可以在所提供的代码中识别名词、谓词和动词,但输出在传递给某种解释器之前实际上不会做任何事情

在RDBMS中,隐藏在解析器和lexer下的解释器会获取这些名词、谓词和动词,并计算理想化的数据访问路径,同时考虑平台的优化(专有或非专有)。访问路径作为谓词列表执行

但是,口译员不必是RBMS。它可能是管理元数据的工具,在这种情况下,结果可能是实体关系的图形图像(例如)

大多数数据库使用几种不同的排序算法,这取决于它们所排序的内容以及它们在信息生命周期的哪个阶段应用排序

当从大容量数据创建有序索引时,它们可以使用树排序或堆排序

选择数据时,第一个选择是选择允许遍历索引的访问路径,该索引按您请求的顺序自然返回数据(即避免排序)

如果数据集必须在检索后进行排序,并且数据集足够小,无法放入内存,则它们通常会使用某种快速排序

如果数据集必须在检索后进行排序,并且数据集太大而无法放入内存,则可以创建一个临时表,并使用堆排序或树排序


我希望这会有所帮助。

您的问题太广泛,对于封闭源代码数据库,答案可能只是猜测。然而,我认为排序操作不太可能是解析sql查询的结果,大多数数据库将对AST(或其他查询表示)执行额外的分析,以确定“最佳”执行计划。sql标准描述了排序/比较的要求,而不是实现。