为啥关系在 SQL 实现中很重要?
Posted
技术标签:
【中文标题】为啥关系在 SQL 实现中很重要?【英文标题】:Why is being relational important in SQL implementations?为什么关系在 SQL 实现中很重要? 【发布时间】:2013-11-08 15:17:02 【问题描述】:在我正在阅读的一本书(Querying SQL Server 2012)中,作者谈到了数据库如何工作的理论。他提到了关系、属性和元组等。
他经常强调 T-SQL 的某些方面不是关系的事实。就像下面的摘录:
与之前的结果是关系的阶段不同,输出 这个阶段的顺序是不相关的,因为它有保证的顺序。这 这个阶段的结果就是标准 SQL 所称的游标。注意 这里使用术语光标是概念性的。 T-SQL 还支持 基于查询结果定义的称为游标的对象, 并且允许以指定的顺序一次获取一行。你 可能关心以特定顺序返回查询结果 出于演示目的或调用者需要使用结果 以这种方式通过一些游标机制来获取第一行 一次。 但请记住,此类处理不是相关的。如果你 需要以关系的方式处理查询结果——例如, 定义一个表表达式,如基于查询的视图(详细信息 在第 4 章后面)——结果需要是相关的。还, 排序数据会增加查询处理的成本。如果你不在乎 关于返回结果行的顺序,可以避免 通过不添加 ORDER BY 子句来增加不必要的成本。
我想知道,因为 SQL
的每个实现几乎都有一个 ORDER BY
子句,这使得它成为非关系的,为什么它甚至重要(@987654323 之后的集合@ 被使用)它不再是关系型了,因为它到处都是这样?
如果他说它是非标准的,我可以理解,例如使用 !=
而不是 <>
来表示不平等,因为这会影响可移植性等,但我不明白为什么某些东西最好是相关的。
请指教。
【问题讨论】:
【参考方案1】:听起来作者指的是使用集合论(用他的话来说是“关系”)与使用游标或类似方法逐行处理。以关系方式访问数据允许数据库引擎执行选择/连接/排序/订单/等。在整个数据集上,游标一次只能处理一行。据我所知,添加 ORDER BY
子句不会使查询“非关系”,作者只是指出,如果您不关心结果集的顺序,您可以将该子句排除在查询之外并且数据库引擎将以最终处理数据的任何顺序返回数据。
还要注意,ORDER BY
子句是数据库引擎最后执行的,这意味着查询以“关系”方式处理,然后在最后一分钟排序。游标从第一条记录开始并逐条移动,因此整个操作将根据您的游标/查询定义以预先确定的顺序执行。
【讨论】:
而且游标和逐行处理比基于集合的操作慢得多。 作者是说 ORDER BY 使它成为非关系型的。这一点他已经提过很多次了。从上面 HLGEM 的评论看来,作者一直提到它的原因可能是因为他希望读者能够区分并在以后了解性能影响。 MuhammadA 是正确的,而且确实如此 - ORDER BY 绝对使结果集 NON-RELATIONAL。 这简直太荒谬了。假设查询引擎返回了已经排序的表,这将是关系型的。相反,如果您明确要求进行此类排序(获得 same 结果),则它不再是相关的。这没有任何意义。如果行的顺序在关系模型中是不相关的,那么:为什么有一个特定的顺序使它不相关?请帮我理解。【参考方案2】:(查询 SQL Server 2012)中的关系查询的要点是:
它返回一个满足查询要求的集合。
但是结果的呈现顺序是不确定的,这意味着它不确定,并且对于同一个数据库可能会发生变化,具体取决于底层流程引擎。
ORDER BY 使其具有确定性,因此在不同的服务器上运行相同的查询可以保证结果的相同顺序。
因此,通过这种方式,添加 ORDER BY 子句之前和之后的顺序可以相同,但并不认为它们会相等(例如,对于不同的补丁)
【讨论】:
以上是关于为啥关系在 SQL 实现中很重要?的主要内容,如果未能解决你的问题,请参考以下文章