【问题标题】:Tuning up a SQL query, (query optimization)调优 SQL 查询,(查询优化)
【发布时间】:2014-01-05 14:54:23
【问题描述】:

我正在尝试调整查询中包含 IN 子句的 SQL 查询。

我尝试用 Join 替换 IN 并查看查询计划。两者在执行时间上看起来相似,但结果不同。有人可以帮我解决这个问题吗? 我在 pgadmin III 中使用商店数据库。 提前致谢。 原始查询:

SELECT person.id
FROM   SHOP.person
WHERE  person.id IN (SELECT personid
                     FROM   SHOP.contactperson
                     WHERE  companyid = 5); 

SELECT person.id
FROM   SHOP.person
       JOIN SHOP.contactperson
         ON person.id = contactperson.id
WHERE  contactperson.companyid = 5; 

已编辑:现在此查询返回正确结果:

SELECT person.id
FROM   SHOP.person
       JOIN SHOP.contactperson
         ON person.id = contactperson.personid
WHERE  contactperson.companyid = 5;

我使用的是contactperson.id 而不是contactperson.id,当我将其更改为正确的查询时,它给了我正确的结果。

【问题讨论】:

  • 性能调优高度特定于供应商 - 我们需要知道您使用的具体数据库(以及哪个版本)。 SQL 只是查询语言 - 被绝大多数关系数据库系统使用.....
  • @marc_s 它是一个商店数据库,我在 pgadmin III 中使用它。
  • 请显示您的表结构,包括索引和查询计划。
  • @MartinSmith 谢谢你,现在一切正常了。
  • 达哈泽注意到了这一点。不是我!

标签: sql postgresql database-tuning sql-tuning


【解决方案1】:
SELECT pe.id
FROM   SHOP.person pe
WHERE  EXISTS (
   SELECT *     
   FROM   SHOP.contactperson cp
   WHERE cp.personid = pe.id
   AND  cp.companyid = 5
   ); 

【讨论】:

  • 我已经检查了您建议的查询和 Darhazer 建议的查询的执行计划,它们是相同的。在什么情况下,这个查询可以比 Darhazer 建议的其他解决方案执行得更好???
  • 它们是不同的。如果 person 和 contactperson 之间存在 1:N 关系(我预料到了,但您没有了解我们的数据模型),Darhazer 的查询将每人产生不止一行,而我正好是一行。
【解决方案2】:

您的连接子句未使用与原始查询相同的字段。您应该使用联系人表中的 personid。

SELECT person.id
FROM SHOP.person 
Join SHOP.contactperson
ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5;

【讨论】:

  • 如果contactperson.personid 不是唯一的,这仍然可以返回不同的结果。
猜你喜欢
  • 2015-09-25
  • 2013-01-10
  • 2014-02-04
  • 2014-11-16
  • 2011-06-22
  • 2015-08-10
相关资源
最近更新 更多