为什么“基于集合的方法”比“程序方法”更好?

时间:2009-12-03 08:17:20

标签: tsql

我非常渴望知道真正的原因,虽然从googling获得了一些知识。

感谢adavnce

5 个答案:

答案 0 :(得分:4)

因为SQL是编写过程代码的一种非常糟糕的语言,并且因为SQL引擎,存储和优化器旨在使汇编和连接记录集有效。

答案 1 :(得分:4)

(请注意,这不仅适用于SQL Server,但我会保留您的标签)

因为,一般来说,进入数据库引擎和优化器的数百个人年的开发时间,以及它可以访问有关数据的实时统计数据的事实,导致它比用户为给定的请求制定处理数据的最佳方法。

因此,通过说出我们想要实现的目标(使用基于集合的方法),并让它决定如何来实现它,我们通常会获得比完全拼写如何来逐行证明数据。

例如,假设我们有一个从表A到表B的简单内连接。在设计时,我们通常不知道'哪个方向'最有效处理:保留所有值的列表A侧,并通过B匹配它们,反之亦然。但是查询优化器将在运行时知道表中的行数,并且最新的统计信息可以提供有关值本身的更多信息。因此,优化器在运行时明确地做出了这个决定。

最后,请注意我已经在这篇文章中提出了一些“一般情况” - 总会有时候我们比优化器更了解,并且在这种情况下我们可以提供提示(NOLOCK等)。

答案 2 :(得分:2)

因为使用基于集合的方法进行SQL开发符合数据模型的设计。 SQL是一种非常基于集合的语言,用于根据数据构建集合,子集,联合等。在使用TSQL进行开发时牢记这一点通常会导致更自然的算法。 TSQL提供了许多在纯SQL中不存在的过程命令,但是不要让它转换为过程方法。

这让我想起了Rob Pike在编程C 的注释中最喜欢的一句话:

  

数据占主导地位。如果您选择了正确的数据结构并组织好了,那么算法几乎总是不言自明的。数据结构而非算法是编程的核心。

SQL数据库以及我们查询它们的方式基本上是基于集合的。因此,我们的算法应该如此。

从更切实的角度来看,SQL服务器在使用基于集合的方法时进行了优化。如果您只是通过基于集合的方法告诉他们您需要的数据,而不是指示您希望如何在程序上获取数据,那么索引,存储系统,查询优化器以及各种SQL数据库实现所做的其他优化将会做得更好。让SQL引擎担心获取数据的最佳方式,您只需担心告诉它您想要的数据。

答案 3 :(得分:2)

基于集合的方法是声明性的,因此您不会描述工作的完成方式,只能描述您希望结果的样子。服务器可以在几个策略之间决定如何与您的请求进行比较,并希望选择一个有效的策略。

如果您编写过程代码,那么在某些情况下,该代码最多不会是最佳的。

答案 4 :(得分:1)

正如每个人所解释的那样,让SQL引擎帮助你,相信它非常聪明。 如果您不使用编写基于集合的解决方案并用于开发过程代码,则必须花一些时间才能编写基于良好格式的集合解决方案。这对大多数人来说是一个障碍。如果你想开始编写基本解决方案的一个提示是,不要再考虑你可以用行做什么,并开始思考你可以用collumns做什么,并且练习函数语言。