Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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(HFSQL):如果WHERE子句,则内部联接在性能上不是对称的?_Sql_Performance_Inner Join_Where Clause_Hyperfilesql - Fatal编程技术网

SQL(HFSQL):如果WHERE子句,则内部联接在性能上不是对称的?

SQL(HFSQL):如果WHERE子句,则内部联接在性能上不是对称的?,sql,performance,inner-join,where-clause,hyperfilesql,Sql,Performance,Inner Join,Where Clause,Hyperfilesql,我有一个基本的HFSQL数据库,有3个表:Company、Person和Worker。每个表有~5列和5000个条目。工人有一个名为IDPerson的人的外键和一个名为IDCompany的实体的外键 我测试了以下两个查询(我只更改内部联接的顺序): 查询1(~5ms执行时间) 查询2(~50ms执行时间) 找到的条目数相同,但执行时间慢10倍。为什么? 内部连接不应该是对称的吗?为什么在使用WHERE子句时,顺序会将性能提高10倍 请帮助我理解这种奇怪的行为 PS:如果我只选择一些列而不是“*”

我有一个基本的HFSQL数据库,有3个表:Company、Person和Worker。每个表有~5列和5000个条目。工人有一个名为IDPerson的人的外键和一个名为IDCompany的实体的外键

我测试了以下两个查询(我只更改内部联接的顺序):

查询1(~5ms执行时间)

查询2(~50ms执行时间

找到的条目数相同,但执行时间慢10倍。为什么? 内部连接不应该是对称的吗?为什么在使用WHERE子句时,顺序会将性能提高10倍

请帮助我理解这种奇怪的行为


PS:如果我只选择一些列而不是“*”,性能问题也是一样的。即使您需要所有列,也最好选择它们而不是使用“*”。这背后的原因是为了让数据库知道你想要什么,而不是收集所有的东西(即使你正在收集所有的东西)

如果您只选择了几个列,那么您是在告诉数据库您知道要提取的内容,因此它将只查找特定列,而不是使用“幕后查询”来获取所有列

至于两个join之间的性能差异,数据库使用繁重的计算来确定最佳执行计划,它将查找要使用的索引,如果您以前运行过查询,缓存也会产生如此大的影响


测试时,请毫不犹豫地使用某些工具清除缓存(它可能会产生相当大的影响)

谢谢。事实上,在我的代码中,我使用了列名,为了更简单,我用“*”代替了stackoverflow帖子:)看看
解释你的sql查询的输出,它会告诉你阻塞在哪里。运行多次查询。确保储藏室是冷的。检查执行计划。最可能的原因是数据库生成不同的执行计划。
SELECT *
FROM Person
INNER JOIN Worker ON Worker .IDPerson = Person.IDPerson
WHERE Worker.Company = 1;
SELECT *
FROM Worker
INNER JOIN Person ON Worker .IDPerson = Person.IDPerson
WHERE Worker.Company = 1;