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
不可为空且存在外键关系,则保证两个查询返回相同的结果。第一个查询是相关子查询-在内部,相关子查询的处理成本非常高,因为必须对外部查询返回的每一行执行内部查询。