Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 子查询选择状态与内部联接_Sql_Performance_Database Performance - Fatal编程技术网

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)
上有一个索引。