Sql 子查询选择状态与内部联接
我对这两种说法感到困惑,这两种说法谁更快、更常用,谁最有利于记忆Sql 子查询选择状态与内部联接,sql,performance,database-performance,Sql,Performance,Database Performance,我对这两种说法感到困惑,这两种说法谁更快、更常用,谁最有利于记忆 select p.id, p.name, w.id, w.name from person p inner join work w on w.id = p.wid where p.id in (somenumbers) vs select p.id, p.name, (select id from work where id=p.wid) , (select name from work where id=p.wid) f
select p.id, p.name, w.id, w.name
from person p
inner join work w on w.id = p.wid
where p.id in (somenumbers)
vs
select p.id, p.name, (select id from work where id=p.wid) , (select name from work where id=p.wid)
from person p
where p.id in (somenumbers)
整个想法是,如果我有一个巨大的数据库,并且我想进行内部连接,那么johin work table和person table将占用内存,性能也会降低,但是子查询select Stations一次只选择一个Station,所以这里哪一个是最好的第二个示例中的子查询将执行一次每行,都会表现不佳。也就是说,一些优化器可以将其转换为一个join-for-you-YMMV
通常要遵循的一个好规则是:更喜欢联接而不是子查询。第二个示例中的子查询将对每一行执行一次,这将执行得很糟糕。也就是说,一些优化器可以将其转换为一个join-for-you-YMMV
一般来说,一个好的规则是:更喜欢连接而不是子查询。首先,这两个查询是不同的。第一个过滤掉
工作
中没有匹配行的所有行
等效的第一个查询使用左连接
:
select p.id, p.name, w.id, w.name
from person p left join
work w
on w.id = p.wid
where p.id in (somenumbers);
然后,第二个查询可以简化为:
select p.id, p.name, p.wid,
(select name from work where w.id = p.wid)
from person p
where p.id in (somenumbers);
如果id已存在于个人
中,则没有理由在工作
中查找该id
如果您想要优化查询,那么您需要个人(id,wid,name)
和工作(id,name)
上的索引
有了这些索引,两个查询的性能应该基本相同。子查询将使用
work
上的索引从work
中获取行,where
子句将使用person
上的索引。这两种查询都应该快速且可扩展。首先,这两种查询不同。第一个过滤掉工作
中没有匹配行的所有行
等效的第一个查询使用左连接
:
select p.id, p.name, w.id, w.name
from person p left join
work w
on w.id = p.wid
where p.id in (somenumbers);
然后,第二个查询可以简化为:
select p.id, p.name, p.wid,
(select name from work where w.id = p.wid)
from person p
where p.id in (somenumbers);
如果id已存在于个人
中,则没有理由在工作
中查找该id
如果您想要优化查询,那么您需要个人(id,wid,name)
和工作(id,name)
上的索引
有了这些索引,两个查询的性能应该基本相同。子查询将使用
work
上的索引从work
中获取行,where
子句将使用person
上的索引。两个查询都应该快速且可扩展。与子查询相比,联接提供了更好的性能。如果Int列上有联接或联接列上有索引,则性能最佳
select p.id, p.name, w.id, w.name
from person p
inner join work w on w.id = p.wid
where p.id in (somenumbers)
与子查询相比,联接提供了更好的性能。若Int列上有联接或联接列上有索引,则性能最佳
select p.id, p.name, w.id, w.name
from person p
inner join work w on w.id = p.wid
where p.id in (somenumbers)
这实际上取决于您希望如何优化查询(包括但不限于添加/删除/重新排序索引) 我发现使连接激增的设置可能会让子查询受到影响,反之亦然。因此,将它们与相同的设置进行比较没有多大意义 我选择使用join并进行优化。根据我的经验,join在其最佳条件下设置,很少会丢失到子查询,但需要阅读的内容很多
当供应商用子查询向系统填充大量查询时。除非由于我的其他工作的查询优化,性能开始爬升,否则根本不值得去改变它们。这实际上取决于您希望如何优化查询(包括但不限于添加/删除/重新排序索引) 我发现使连接激增的设置可能会让子查询受到影响,反之亦然。因此,将它们与相同的设置进行比较没有多大意义 我选择使用join并进行优化。根据我的经验,join在其最佳条件下设置,很少会丢失到子查询,但需要阅读的内容很多
当供应商用子查询向系统填充大量查询时。除非性能开始爬升,否则由于我的其他工作的查询优化,根本不值得努力更改它们。您使用的是性能不如内部联接的相关子查询。这意味着什么?为什么不呢?我删除了无关的数据库标记。请随意添加您实际使用的数据库。性能问题通常高度依赖于数据库。您使用的是性能不如内部联接的相关子查询。这意味着什么?为什么不删除无关的数据库标记。请随意添加您实际使用的数据库。性能问题通常高度依赖于数据库。但是连接查询执行起来会占用很多内存,不是吗?@MohemmadAlBughdadi无内存使用对于连接来说非常有效。但是连接查询执行起来会占用很多内存,不是吗?@MohemmadAlBughdadi无内存使用对于连接来说非常有效。所以如果我没有使用那么第一个语句应该更快更好,不是吗?@MohemmadAlBughdadi。如果您没有索引,那么这两个版本在处理大量数据时都会不必要地慢。但是,如果
id
被声明为主键,那么您可能在work(id)
上有一个索引。因此,如果我没有使用索引,那么第一个语句应该更快更好,不是吗?@MohemmadAlBughdadi。如果您没有索引,那么这两个版本在处理大量数据时都会不必要地慢。但是,如果id
被声明为主键,则您可能在work(id)
上有一个索引。