Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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
Oracle SQL:一个选择需要很长时间,另一个选择很快_Sql_Performance_Oracle_Select_Indexing - Fatal编程技术网

Oracle SQL:一个选择需要很长时间,另一个选择很快

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

我有两个选择在同一个视图上。一个选择将使用主键进行筛选,另一个选择将在非唯一索引上进行筛选。使用的视图很复杂。使用主键选择大约需要15秒。具有非唯一索引的选择需要0.5秒

为什么使用主键的查询速度如此之慢

我使用“解释计划”为两者创建执行计划

快速选择的执行计划:

慢速选择的执行计划:

分别在TableA和ViewX上进行选择是快速的

--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;