首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"_hash_join_enabled“在oracle中的用途是什么?oracle如何在内部决定是嵌套循环还是Hash Join Optimizer?

"_hash_join_enabled“在oracle中的用途是什么?oracle如何在内部决定是嵌套循环还是Hash Join Optimizer?
EN

Stack Overflow用户
提问于 2021-09-21 05:19:32
回答 2查看 283关注 0票数 0

我想优化sql查询。它在内部执行Hash Join,因此它将进行全表扫描以获得结果。

代码语言:javascript
复制
alter session set "_hash_join_enabled" = false;

如果我使用上面的命令,oracle会执行嵌套循环,并且没有全表扫描。

有没有人能给我推荐一下它的实时应用?

EN

回答 2

Stack Overflow用户

发布于 2021-09-21 06:00:19

问题不在于全表扫描,而在于执行查询的时间。优化器之所以选择散列连接和FTS,是因为它认为它比嵌套循环更快。通常,这是统计数据或查询编写方式的问题。

如果你真的想通过这样的提示来做,那么就像注释所说的那样,在语句级别使用它(例如,opt_param('_hash_join_enabled','false')或use_nl(按照你想要的顺序在这里放置表名))。

票数 1
EN

Stack Overflow用户

发布于 2021-09-21 06:09:46

通常,任何以下划线开头的参数都是未记录的参数。在生产系统中设置任何未记录的参数都是不明智的,除非Oracle支持明确要求您这样做。这几乎总是在他们确认您遇到特定的bug并帮助您确定最好的解决方法是设置一个未记录的参数之后出现。

禁用会话的散列联接意味着该会话运行的任何操作都不会考虑使用散列联接。至少,在设置类似的内容之前,您需要分析会话可能运行的每个查询(最有可能是应用程序可能运行的每个查询)的计划,以确定它们当前是否正在使用散列连接,以及如果它们使用其他连接,预期的性能影响会是什么。而且,您可能希望在较低的环境中进行一次完整的性能回归测试,以确定更改对应用程序性能的影响。系统很少会有一些查询不能从使用散列连接中获益。

如果问题是单个查询,那么在会话级别进行任何参数更改都可能是多余的。在单个查询级别上解决单个查询的问题要有意义得多。大多数情况下,当Oracle优化器选择一个糟糕的计划时,问题是您在一个或多个对象上的统计信息是不正确的。这导致Oracle相信表扫描将比实际效率更高,或者预期嵌套循环连接将比实际效率更低。可能是统计信息过时了,或者是某个特定的统计信息(例如,带有倾斜数据的列上的直方图)丢失了。如果您可以通过修复统计信息来修复问题,这是首选的方法。

如果您不能通过修复统计信息来修复问题,则可以考虑对查询应用提示。您可以在特定查询的提示中设置未记录的参数,但最好坚持使用记录的提示。如果我试图改变计划,我需要的是告诉优化器您想要发生什么的提示,比如use_nl hint,而不是告诉优化器什么是不允许的提示。如果禁用散列联接,Oracle很可能会因为统计信息更改或数据库升级而开始执行合并联接,而不是嵌套循环联接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69263716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档