![]() |
1
1
可以使用基于函数的索引。 您的查询是:
在您的案例中,索引没有被使用,因为
所以…为添加索引
|
![]() |
2
11
|
![]() |
3
8
,因为它不能使用索引。Oracle无法反转
这是好的:
|
![]() |
4
1
如果使用围绕参数的显式转换运行查询(例如,根据需要转换为_char(:1)或_number(:1),会发生什么情况?如果这样做使查询运行得很快,您就得到了答案。 但是,如果查询在显式转换中仍然运行缓慢,则可能还有另一个问题。您没有提到正在运行的Oracle版本,如果您的高基数列(natural_key1)的值的分布非常不均匀,则您可能正在使用在首次运行查询时生成的查询计划,该计划对:1使用了不利的值。 例如,如果100万行的表中有40万行的自然关键字1=1234,其余60万行是唯一的(或几乎是唯一的),那么如果查询被约束在自然关键字1=1234,优化器将不会选择索引。由于您使用的是绑定变量,如果这是第一次运行查询,那么优化器将为所有后续运行选择该计划。
这将从优化器的大脑中删除所有查询计划,因此下一次运行的语句将被重新优化。或者,您可以将该语句作为带有文本的直接SQL来运行,而不需要绑定变量。如果这两种情况都运行良好,你就会知道你的问题是由于计划的腐败。 如果是这种情况,您不希望在生产环境中使用alter system命令-如果定期运行它,可能会破坏系统的其余性能,但您可以使用动态SQL而不是绑定变量来绕过它,或者如果可以提前确定:1是非选择性的,请使用稍有不同的查询。对于非选择性的情况(例如重新排序WHERE子句中的条件,这将导致优化器使用不同的计划)。
我不太喜欢索引提示——它们是一种非常脆弱的编程方法。如果索引上的名称发生了变化,在查询开始执行得不好之前,您永远不会知道它。另外,如果服务器升级或数据分发发生了变化,导致优化器能够选择更好的计划,则可能会让您陷入困境。 |
![]() |
S. Jacson · 任意两台发电机的速度差(内置功能) 2 年前 |
![]() |
Sadeq Dousti · 相当于“嵌套删除”的执行性能SQL查询 2 年前 |
![]() |
Prince · 复制大型文件需要更多时间 2 年前 |
![]() |
Sagar · 为什么在循环之外声明变量会更快? 2 年前 |
![]() |
seco · 如何在不挂起页面的情况下加载JS 2 年前 |