调整SQL查询(查询优化)

调整SQL查询(查询优化),sql,postgresql,database-tuning,sql-tuning,Sql,Postgresql,Database Tuning,Sql Tuning,我正在尝试优化查询中包含IN子句的SQL查询 我试着用Join替换IN并查看了查询计划。两者在执行时间上看起来相似,但结果不同。有人能帮我解决这个问题吗? 我正在使用pgadmin III中的商店数据库。 提前谢谢。 原始查询: SELECT person.id FROM SHOP.person WHERE person.id IN (SELECT personid FROM SHOP.contactperson

我正在尝试优化查询中包含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.personid
WHERE  contactperson.companyid = 5;

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

您的join子句使用的字段与原始查询的字段不同。您应该使用contactperson表中的personid

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

join子句使用的字段与原始查询的字段不同。您应该使用contactperson表中的personid

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

join子句使用的字段与原始查询的字段不同。您应该使用contactperson表中的personid

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

join子句使用的字段与原始查询的字段不同。您应该使用contactperson表中的personid

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


性能调优是高度特定于供应商的—我们需要知道您使用的是什么具体的数据库(以及哪个版本)。SQL只是查询语言-被绝大多数关系数据库系统使用…@marc_是一个商店数据库,我在pgadmin III中使用它。请显示您的表结构,包括索引和查询计划。@MartinSmith谢谢您,现在它工作得很好。是Darhazer注意到了这一点。不是我!性能调优是高度特定于供应商的—我们需要知道您使用的是什么具体的数据库(以及哪个版本)。SQL只是查询语言-被绝大多数关系数据库系统使用…@marc_是一个商店数据库,我在pgadmin III中使用它。请显示您的表结构,包括索引和查询计划。@MartinSmith谢谢您,现在它工作得很好。是Darhazer注意到了这一点。不是我!性能调优是高度特定于供应商的—我们需要知道您使用的是什么具体的数据库(以及哪个版本)。SQL只是查询语言-被绝大多数关系数据库系统使用…@marc_是一个商店数据库,我在pgadmin III中使用它。请显示您的表结构,包括索引和查询计划。@MartinSmith谢谢您,现在它工作得很好。是Darhazer注意到了这一点。不是我!性能调优是高度特定于供应商的—我们需要知道您使用的是什么具体的数据库(以及哪个版本)。SQL只是查询语言-被绝大多数关系数据库系统使用…@marc_是一个商店数据库,我在pgadmin III中使用它。请显示您的表结构,包括索引和查询计划。@MartinSmith谢谢您,现在它工作得很好。是Darhazer注意到了这一点。不是我!如果
contactperson.personid
不唯一,则仍可返回不同的结果。如果
contactperson.personid
不唯一,则仍可返回不同的结果。如果
contactperson.personid
不唯一,则仍可返回不同的结果
contactperson.personid
不是唯一的。我已经检查了您建议的查询和Darhazer建议的查询的执行计划,它们是相同的。在什么情况下,这个查询可以比Darhazer建议的其他解决方案执行得更好???它们是不同的。如果person和contactperson之间存在1:N的关系(我希望是这样,但您没有告诉我们数据模型),Darhazer的查询将为每个人生成多行,而我只会生成一行。我已经检查了您建议的查询和Darhazer建议的查询的执行计划,它们是相同的。在什么情况下,这个查询可以比Darhazer建议的其他解决方案执行得更好???它们是不同的。如果person和contactperson之间存在1:N的关系(我希望是这样,但您没有告诉我们数据模型),Darhazer的查询将为每个人生成多行,而我只会生成一行。我已经检查了您建议的查询和Darhazer建议的查询的执行计划,它们是相同的。在什么情况下,这个查询可以比Darhazer建议的其他解决方案执行得更好???它们是不同的。如果person和contactperson之间存在1:N的关系(我希望是这样,但您没有告诉我们数据模型),Darhazer的查询将为每个人生成多行,而我只会生成一行。我已经检查了您建议的查询和Darhazer建议的查询的执行计划,它们是相同的。在什么情况下,这个查询可以比Darhazer建议的其他解决方案执行得更好???它们是不同的。如果person和contactperson之间存在1:N关系(我希望是这样,但您没有告诉我们数据模型),Darhazer的查询将为每个人生成多行,而我的查询正好是一行。