Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.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_Oracle_Oracle10g - Fatal编程技术网

SQL查询的性能分析

SQL查询的性能分析,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,哪个性能更好? 第1部分: select (select a from innertable I where i.val=o.val) , val1, val2 from outertable o 问题2: select i.a ,o.val1 ,o.val2 from outertable o join innertable i on i.val=o.val 为什么??请提供建议。正如Ollie所建议的,确定两个查询中哪一个更有效的

哪个性能更好?

第1部分:

select (select a from innertable I where i.val=o.val)
       , val1, val2 
from outertable o
问题2:

select i.a
       ,o.val1
       ,o.val2 
from outertable o 
     join innertable i on i.val=o.val

为什么??请提供建议。

正如Ollie所建议的,确定两个查询中哪一个更有效的唯一确定方法是使用您的数据对这两种方法进行基准测试,因为这两种方法的性能可能取决于数据量、数据结构、存在的索引等

通常,您发布的两个查询将返回不同的结果。除非您保证
outertable
中的每一行在
innertable
中正好有一行对应,否则这两个查询将返回不同数量的行。如果
innertable
中没有匹配的行,则第一个查询将为
outertable
中的每一行返回一行,第一列为NULL。如果
innertable
中没有匹配的行,则第二个查询将不会返回任何内容。类似地,如果
innertable
中的任何特定行的
innertable
中有多个匹配行,则第一个查询将返回错误,而第二个查询将为
outertable
中的该行返回多个行


如果您确信这两个查询在您的特定情况下返回相同的结果集,因为您可以保证
innertable
中的每一行对应
outertable
(在这种情况下,您的数据模型将表分开至少有点奇怪),第二种选择是编写查询的更自然的方式,因此优化器最有可能找到更高效的计划

我不知道oracle的具体情况,但第二个在MySQL中的性能会更好。第一种方法使用子选择,强制引擎创建临时表(并在持续时间内锁定innertable)。尽可能使用联接,这是引擎的设计目的。为什么不对它们进行基准测试并查看?通常,可以使用EXPLAIN查看查询计划器对给定查询执行的操作这些字段是否已索引?然后使用explain-too查看哪个执行better@AruM:这两种说法不相等!只有当innertable和outertable之间存在1:1关系时,第一种方法才有效。如果
innertable
中有多行
val
+1的相同值,则它将失败,尽管1-1关系不是强制性的:很可能
innertable
是一个查找表,因此val是它的主键。在这种情况下,第一个查询将返回与外部联接相同的结果。如果
val
不可为空且存在外键关系,则保证两个查询返回相同的结果。第一个查询是相关子查询-在内部,相关子查询的处理成本非常高,因为必须对外部查询返回的每一行执行内部查询。