Oracle SQL:一个选择需要很长时间,另一个选择很快
我有两个选择在同一个视图上。一个选择将使用主键进行筛选,另一个选择将在非唯一索引上进行筛选。使用的视图很复杂。使用主键选择大约需要15秒。具有非唯一索引的选择需要0.5秒 为什么使用主键的查询速度如此之慢 我使用“解释计划”为两者创建执行计划 快速选择的执行计划: 慢速选择的执行计划: 分别在TableA和ViewX上进行选择是快速的Oracle SQL:一个选择需要很长时间,另一个选择很快,sql,performance,oracle,select,indexing,Sql,Performance,Oracle,Select,Indexing,我有两个选择在同一个视图上。一个选择将使用主键进行筛选,另一个选择将在非唯一索引上进行筛选。使用的视图很复杂。使用主键选择大约需要15秒。具有非唯一索引的选择需要0.5秒 为什么使用主键的查询速度如此之慢 我使用“解释计划”为两者创建执行计划 快速选择的执行计划: 慢速选择的执行计划: 分别在TableA和ViewX上进行选择是快速的 --this select needs 0,5 seconds select * from TableA where id = 5440; Resu
--this select needs 0,5 seconds
select *
from TableA
where id = 5440;
Result: ID = 5440, ProjektID = 2220, TableB_ID = 123, TableC_ID = 5325, TableD_ID = 7654
--this select needs 0,3 seconds
Select *
viewX x
where TableB_ID = 123 and
TableC_ID = 5325 and
TableD_ID = 7654;
感谢您的支持我想说这是因为优化器将根据视图分解select以根据基表进行选择。在第二种情况下,您没有合并其他表的所有行,只是合并满足该表的where子句的行,因此第二个查询速度更快,因为它必须通过更少的行。我认为这是因为优化器将根据视图分解select,以根据基表进行选择。在第二种情况下,您没有合并其他表的所有行,只是合并满足该表where子句的行,因此第二个查询速度更快,因为它必须通过更少的行。可能是缓存第二个查询的结果(请参阅)要扩展@tbone的答案,可以做两件事来帮助消除缓冲的影响。一种是每个查询运行两次,只使用第二次运行的结果进行比较。另一种方法是在运行每个查询之前刷新缓存,使用类似于
ALTER SYSTEM flush SHARED_POOL
和ALTER SYSTEM flush BUFFER_cache
的方法。共享和享受。因此,在每一行中,从3个FK开始,2始终是0
,只有1具有实际引用。对吗?您好,ypercube,这是对的。也许第二次查询的缓存结果(请参阅)在@tbone的答案上展开有两件事可以帮助消除缓冲的影响。一种是每个查询运行两次,只使用第二次运行的结果进行比较。另一种方法是在运行每个查询之前刷新缓存,使用类似于ALTER SYSTEM flush SHARED_POOL
和ALTER SYSTEM flush BUFFER_cache
的方法。共享和享受。因此,在每一行中,从3个FK开始,2始终是0
,只有1具有实际引用。对吗?你好,我是对的。
--this select needs 0,5 seconds
select *
from TableA
where id = 5440;
Result: ID = 5440, ProjektID = 2220, TableB_ID = 123, TableC_ID = 5325, TableD_ID = 7654
--this select needs 0,3 seconds
Select *
viewX x
where TableB_ID = 123 and
TableC_ID = 5325 and
TableD_ID = 7654;