使用一个复杂的查询或几个更简单的查询是否更好?

时间:2011-07-21 03:48:41

标签: database

哪个选项更好:

  1. 编写具有大量连接的非常复杂的查询,或
  2. 一个接一个地编写2个查询,将获得的已处理查询的结果集应用于其他查询。

6 个答案:

答案 0 :(得分:5)

通常,一个查询优于两个查询,因为优化程序有更多信息可以使用,并且可能能够生成比单独查询更有效的查询计划。此外,使用两个(或更多)查询通常意味着您将多次运行第二个查询,并且DBMS可能必须重复生成查询的查询计划(但如果您准备语句并将参数作为占位符传递则不会当(重新)执行查询时。这意味着程序和DBMS之间的来回交换更少。如果您的DBMS位于世界(或国家)另一端的服务器上,这可能是一个重要因素。

反对组合这两个查询,最终可能会在DBMS和应用程序之间传递大量重复数据。如果表T1中的10,000行中的每一行与表T2中的平均30行连接(因此总共返回300,000行),那么您可能会将大量数据重复发送回客户端。如果T1的(相关投影)的行大小相对较小并且来自T2的数据相对较大,则这无关紧要。如果来自T1的数据很大且来自T2的数据很小,那么这可能很重要;决定之前的措施。

答案 1 :(得分:2)

当我还是一名初级数据库人员时,我曾在营销部门工作了一年,在那里我有很多空闲时间,我以2或3种不同的方式完成每项任务。我养成了编写一个mega-select的习惯,它一次性抓住所有内容并将其与构建所选主键的临时表的脚本进行比较,然后一旦我获得了正确的密钥就获得了数据值。

几乎在所有情况下,第二种方法都更快。处理少量小桌子的情况。最明显更快的地方当然是大表和多个连接。

我养成了从tableA中选择所需主键的习惯,从tableB中选择所需的主键等。加入它们并选择最后一组主键。使用选定的主键返回表格并获取数据值。

作为一名DBA,我现在明白这种方法可以减少对数据缓存的清除,并且与使用数据库的其他人一起玩得更好(如Amir Raminfar所述)。

但它确实需要使用某些地方/ DBA不喜欢的临时表(在我看来是不公平的)

答案 2 :(得分:1)

取决于实际查询和实际数据库,即SQL,Oracle mySQL。

答案 3 :(得分:1)

在大公司,他们更喜欢选项2,因为选项1会占用数据库cpu。这导致所有其他连接缓慢,一切都是瓶颈。话虽如此,这一切都取决于您的数据和您加入的数量。如果您加入10000到1000,那么您将获得10000 x 1000记录。 (假设内部联接)

可能重复MySQL JOIN Abuse? How bad can it get?

答案 4 :(得分:1)

假设“更好”意味着“更快”,您可以在junit测试中轻松测试这些场景。请注意,您可能无法从单元测试中获得的决定因素是网络延迟。如果数据库位于运行单元测试的计算机旁边,则可能会发现归因于网络的性能没有差异。如果您的生产服务器位于数据库中的另一个城镇,国家或大陆,则网络流量将成为瓶颈。你不想在电线上来回走动 - 你更有可能想要一次往返并一次性完成任务。

同样,这一切都取决于:)

答案 5 :(得分:0)

这可能取决于很多事情:

  • 您已设置的索引
  • 有多少桌子,
  • 实际查询是什么,
  • 数据集有多大,
  • 底层数据库是什么,
  • 您正在使用的桌面引擎

最好的办法可能是在各种测试数据上测试这两种方法,看看哪一个瓶颈。

如果您使用的是MySQL,(可能是Oracle?),您可以使用

EXPLAIN SELECT ..... 

它将为您提供有关如何执行查询的大量信息,以及如何改进查询等。