当前位置: 首页 > 面试题库 >

更好的SQL-:group vs.:select =>'DISTINCT'

柏高丽
2023-03-14
问题内容

让我们假设三种模型,标准联接:

class Mailbox < ActiveRecord::Base
  has_many :addresses
  has_many :domains, :through => :addresses
end

class Address < ActiveRecord::Base
  belongs_to :mailbox
  belongs_to :domain
end

class Domain < ActiveRecord::Base
  has_many :addresses
  has_many :mailboxes, :through => :addresses
end

现在显然,如果您想知道给定邮箱在哪个域中的地址,则有两种可能的解决方法:

m = Mailbox.first
# either: SELECT DISTINCT domains.id, domains.name FROM "domains" INNER JOIN 
#         "addresses" ON "domains".id = "addresses".domain_id WHERE 
#         (("addresses".mailbox_id = 1))
m.domains.all(:select => 'DISTINCT domains.id, domains.name')
# or: SELECT domains.id, domains.name FROM "domains" INNER JOIN "addresses" ON
#     "domains".id = "addresses".domain_id WHERE (("addresses".mailbox_id = 1))
#      GROUP BY domains.id, domains.name
m.domains.all(:select => 'domains.id, domains.name', 
  :group => 'domains.id, domains.name')

对我来说,问题是我不知道哪种解决方案更好。当我不指定任何其他条件时,PostgreSQL查询计划程序倾向于使用解决方案二(按预期工作),但是如果我向查询添加条件,则归结为“唯一”与“组”:

使用“ DISTINCT”:

 Unique  (cost=16.56..16.57 rows=1 width=150)
   ->  Sort  (cost=16.56..16.56 rows=1 width=150)
         Sort Key: domains.name, domains.id
         ->  Nested Loop  (cost=0.00..16.55 rows=1 width=150)
               ->  Index Scan using index_addresses_on_mailbox_id on addresses  (cost=0.00..8.27 rows=1 width=4)
                     Index Cond: (mailbox_id = 1)
               ->  Index Scan using domains_pkey on domains  (cost=0.00..8.27 rows=1 width=150)
                     Index Cond: (domains.id = addresses.domain_id)
                     Filter: (domains.active AND domains.selfmgmt)
(9 rows)

使用“ GROUP BY”:

Group  (cost=16.56..16.57 rows=1 width=150)
   ->  Sort  (cost=16.56..16.56 rows=1 width=150)
         Sort Key: domains.name, domains.id
         ->  Nested Loop  (cost=0.00..16.55 rows=1 width=150)
               ->  Index Scan using index_addresses_on_mailbox_id on addresses  (cost=0.00..8.27 rows=1 width=4)
                     Index Cond: (mailbox_id = 1)
               ->  Index Scan using domains_pkey on domains  (cost=0.00..8.27 rows=1 width=150)
                     Index Cond: (domains.id = addresses.domain_id)
                     Filter: (domains.active AND domains.selfmgmt)
(9 rows)

我真的不确定如何确定检索这些数据的更好方法。我的直觉告诉我要使用“ GROUP BY”,但是我找不到足够具体的文档来解决此问题。

我应该使用“:group”还是“:select
=>’DISTINCT’”?这个选择是否与其他现代RDBMS(例如Oracle,DB2或MySQL)一样(我无法访问这些,所以我无法执行测试)?


问题答案:

如果您使用的是Postgresql <8.4(考虑到计划,我想是的)–通常最好使用GROUP BY而不是,DISTINCT因为它的计划更加有效。

在8.4中,没有区别,因为DISTINCT被“教导”也可以使用组运算符



 类似资料:
  • 问题内容: 我听说在编写SQL命令时通常不宜使用这种做法,因为它对于您特别需要的列更有效。 如果我需要表中的每一列,我应该使用 或者 在这种情况下,效率真的重要吗?我认为,如果您确实需要所有数据,则内部会更理想,但我是在没有真正理解数据库的情况下说这一点。 我很好奇这种情况下的最佳做法。 更新: 我可能应该指定,我真正 想要 做的唯一情况是当我从一个表中选择数据时,我知道所有列都将始终需要检索,即

  • 问题内容: 在 SQL Server中 ,可以使用以下语句将行插入表中: 是否还可以使用 更新 表?我有一个包含这些值的临时表,并想使用这些值更新另一个表。也许是这样的: 问题答案:

  • 主要内容:语法,示例SQL SELECT 语句用于从表中选取符合条件的数据,该数据以临时表的形式返回,称为结果集。 语法 SELECT 语句的基本语法如下: SELECT column1, column2, columnN FROM table_name WHERE conditions; column1, column2, columnN 表示选取的列,conditions 表示筛选条件,只有满足条件的数据才会被选

  • 我的DB MySQL上有这样的情况: 表_A Cod |值1 |值2 |值3 TABLE_B 鳕鱼|价值4|价值5 表C Cod |值6 我使用这个查询: 一切都很好,但是现在我必须从TABLE_A中选择元素(与TABLE_B和TABLE_C连接)并与TABLE_A上的一个元素连接。 例如,当时,当时,也选择和时,则相反。 编辑:(从OP的评论中添加): 我的查询结果 例如:(< code > 1

  • 1. 定义 维基百科:SQL Select指令用于查询数据库中的数据。 慕课解释:SQL Select,传闻中增删查改中的查,是查询数据库数据的主要途径。 2. 前言 本小节,我们将一起学习 SQL Select。 通过 Select 指令,我们可以便捷地从数据库中获取数据,本小节我们将分别介绍如何使用 Select 获取数据库信息以及数据表数据。 本小节测试数据如下,请先在数据库中执行: DRO

  • SELECT DISTINCT 语句用于返回唯一不同的值。 SQL SELECT DISTINCT 语句 在表中,一个列可能会包含多个重复值,有时您也许希望仅仅列出不同(distinct)的值。 DISTINCT 关键词用于返回唯一不同的值。 SQL SELECT DISTINCT 语法SELECT DISTINCT column_name,column_name FROM table_name;