加入是为了懒人?

Bas*_*mme 168 c# java sql join

我最近与另一位开发人员进行了讨论,他向我声称JOIN(SQL)没用.这在技术上是正确的,但他补充说,使用连接比在代码(C#或Java)中创建多个请求和链接表效率低.

对于他来说,加入的是懒惰的人,他们不关心表现.这是真的?我们应该避免使用连接吗?

Mic*_*rdt 187

不,我们应该避免持有这种令人难以置信的错误观点的开发者.

在许多情况下,数据库连接比通过客户端完成的任何操作快几个数量级,因为它避免了数据库往返,并且数据库可以使用索引来执行连接.

在我的头脑中,我甚至无法想象一个正确使用的连接比等效的客户端操作慢的单一场景.

编辑:在一些罕见的情况下,自定义客户端代码可以比简单的DB连接更有效地执行操作(请参阅meriton的评论).但这是一个例外.

  • 如果加入数据库导致通过网络发送的结果集中出现严重冗余,则加入应用服务器*可以更高效.考虑表A和B,其中A中的每一行与B中的20行相关联,B只有100行,并且我们想要从A中获取前1000行以及来自B的相关行.在数据库中加入将导致20*通过网络发送1000个元组.如果在应用服务器中完成连接(首先将整个B表提取到内存中),则仅通过网络发送100 + 1000行. (56认同)
  • 我很幸运能够与在Microsoft工作SQL Server的一些开发人员交谈.它会让你头晕目眩,听到他们对查询的优化.任何认为他们比那更聪明的人都需要被打击. (13认同)
  • 但是,您肯定是正确的,因为在大多数情况下,数据库上的连接速度要快得多,因此不仅仅是方便,而且是必要的. (7认同)
  • @meriton我有点惊讶; 我希望客户端库优化交叉连接. (2认同)

Mar*_*ell 83

听起来像你的同事会使用无sql文档数据库或键值存储.这些本身就是非常好的工具,非常适合许多问题.

但是,关系数据库经过大量优化以便使用集合.有基于连接的是查询数据的很多,很多方面远远超过许多往返的效率更高.这就是rdbms的多功能性所在.您也可以在nosql存储中实现相同的功能,但是您最终会构建一个适合查询的每种不同性质的独立结构.

简而言之:我不同意.在RDBMS中,连接是基础.如果您不使用它们,则不会将它用作RDBMS.


seh*_*ehe 46

嗯,他在一般情况下是错的.

数据库能够使用各种方法进行优化,这可以通过优化器提示,表索引,外键关系以及可能的其他数据库供应商特定信息来实现.


ric*_*lla 24

不,你不应该.

数据库专门用于处理数据集(显然......).因此,他们在这方面非常有效率.通过在他自己的代码中进行基本上手动连接,他试图接管专门为工作设计的东西的角色.他的代码与数据库中的代码一样高效的可能性非常小.

顺便说一下,没有连接,使用数据库的重点是什么?他也可以只使用文本文件.

  • 排序!这就是为什么.:p (2认同)
  • 即使没有加入?自动内存映射,自动查询缓存,许多其他自动化的东西,大多数文件系统都没有发生.哦,我提到了精细可控的交易吗? (2认同)

MJB*_*MJB 19

如果"懒惰"被定义为想要编写更少代码的人,那么我同意.如果"懒惰"被定义为想要让工具做他们擅长的工作的人,我同意.因此,如果他只是同意Larry Wall(关于优秀程序员的属性),那么我同意他的看法.

  • @Dran Dane:加入是懒人,是的.它们可能表现良好的事实是正交的. (3认同)

Gio*_*lbo 16

嗯,连接是关系数据库如何将表相互关联的.我不确定他在做什么.

如何对数据库进行多次调用比一次调用更有效?在执行此类操作时,优化了sql引擎.

也许你的同事懒得学习SQL.


Red*_*ain 12

是的你应该.

而且由于性能的原因,你应该使用C++而不是C#.C#适合懒人.

不不不.由于性能原因,您应该使用C而不是C++.C++适合懒惰的人.

不不不.由于性能原因,您应该使用程序集而不是C语言.C适合懒人.

是的,我在开玩笑.你可以在没有连接的情况下制作更快的程序,你可以使用更少的内存而无需连接.但在许多情况下,您的开发时间比CPU时间和内存更重要.放弃一点表演,享受生活.不要为了一点点的表现而浪费你的时间.并告诉他"你为什么不从你的地方到你的办公室直道?"


Pis*_*3.0 11

"这技术上是正确的" - 类似地,SQL数据库是无用的:当你使用一堆CSV文件得到相同的结果并在代码中关联它们时,使用一个是什么意思?哎呀,任何抽象都是为了懒人,让我们回到硬件上的机器代码编程!;)

此外,除了最复杂的情​​况之外,他的论点是不真实的:RDBMS经过大量优化,可以快速实现JOIN .关系数据库管理系统,对吧?

  • +1如果OP在前一句中习惯用"不必要的"而不是"无用的"来表达,那么"......技术上真实"这句话会更好.说连接是无用的显然是不真实的,没有需要考虑的技术问题.在任何情况下,OP和同事对RDBMS点的误解都是非常罕见的:http://stackoverflow.com/q/5575682/47550 (2认同)

Sri*_*nth 7

我工作的最后一家公司也没有使用SQL连接.相反,他们将此工作移至应用层,该应用层旨在水平扩展.此设计的基本原理是避免在数据库层工作.通常数据库成为瓶颈.它比数据库更容易复制应用程序层.可能还有其他原因.但这是我现在可以记得的那个.

是的我同意与数据库完成的连接相比,在应用程序层完成的连接效率低下.更多的网络通信也.

请注意,我没有采取严厉措施来避免SQL连接.


Jon*_*onH 5

如果没有加入,您如何将订单商品与订单联系起来?这是关系数据库管理系统的重点.没有连接就没有关系数据,您也可以使用文本文件来处理数据.

听起来他不理解这个概念所以他试图让它看起来毫无用处.他认为excel是一个数据库应用程序的人是同一类型的人.愚蠢地告诉他,让他阅读更多有关数据库的内容.通过C#建立多个连接并提取数据和合并数据是错误的做事方式.


Jod*_*ell 5

我不明白语句"加入SQL是无用的"的逻辑.在处理数据之前过滤和限制数据是否有用?正如您所做的其他响应者已经说过这是数据库引擎所做的,它应该是他们擅长的.

也许懒惰的程序员会坚持使用他们熟悉的技术,并且出于非技术原因而避开其他可能性.

我留给你决定.


pho*_*oog 5

让我们考虑一个示例:一张包含发票记录的表格,以及一张包含发票行项目记录的相关表格.考虑客户端伪代码:

for each (invoice in invoices)
    let invoiceLines = FindLinesFor(invoice)
...
Run Code Online (Sandbox Code Playgroud)

如果您有100,000个发票,每个发票10行,此代码将从100万个表中查找10个发票行,并且它将执行100,000次.随着表格大小的增加,选择操作的数量增加,并且每个选择操作的成本增加.

如果您有几千条或更少的记录,那么计算机速度很快,您可能不会注意到两种方法之间的性能差异.因为成本增加超过线性,随着记录数量的增加(比如数百万),您将开始注意到差异,随着数据集大小的增加,差异将变得不那么容忍.

然而,加入.将使用表的索引并合并两个数据集.这意味着您有效地扫描第二个表一次而不是随机访问N次.如果定义了外键,则数据库已在内部存储的相关记录之间具有链接.

想象一下你自己做这件事.您有一个按字母顺序排列的学生名单和一份包含所有学生成绩报告的笔记本(每个班级一页).笔记本按学生的名字按顺序排序,顺序与列表相同.你想怎么样?

  1. 从列表中读取名称.
  2. 打开笔记本电脑.
  3. 找到学生的名字.
  4. 阅读学生的成绩,翻页直到您到达下一个学生或最后一页.
  5. 关闭笔记本电脑.
  6. 重复.

要么:

  1. 将笔记本打开到第一页.
  2. 从列表中读取名称.
  3. 从笔记本中读取该名称的所有等级.
  4. 重复步骤2-3,直到结束
  5. 关闭笔记本电脑.


jco*_*lum 5

听起来像是" 我能写得更好 " 的经典案例.换句话说,他看到了一些他认为是颈部疼痛的东西(在SQL中编写了一堆连接)并且说"我确信我可以写得更好并获得更好的性能." 你应该问他是否a)更聪明,b)比那些深入Oracle或SQL Server优化代码的典型人更受教育.可能性不大.