gpt4 book ai didi

Oracle 绑定(bind)查询非常慢

转载 作者:行者123 更新时间:2023-12-02 09:12:43 25 4
gpt4 key购买 nike

我有一个 Oracle 绑定(bind)查询,在我的 C# 程序中执行时非常慢(大约 2 分钟),但在 SQL Developer 中运行得非常快。它有两个命中表索引的参数:

select t.Field1, t.Field2
from theTable t
where t.key1=:key1
and t.key2=:key2

此外,如果我删除绑定(bind)变量并创建动态 sql,它的运行方式就像在 SQL Developer 中一样。

有什么建议吗?

顺便说一句,我正在使用 ODP。

最佳答案

如果您在 sql Developer 中用静态变量替换绑定(bind)变量,那么您实际上并没有运行相同的测试。确保使用绑定(bind)变量,如果它也很慢,那么您只是被错误的缓存执行计划所困扰。更新该表上的统计信息应该可以解决该问题。

但是,如果您实际上在 SQL 开发人员中使用绑定(bind)变量,那么请继续阅读。 TLDR 版本是 ODP.net 运行时的参数有时会导致稍微悲观的方法。从更新统计数据开始,但让您的 dba 捕获两种情况下的执行计划并进行比较以确认。

我从这里重新发布我的答案:https://stackoverflow.com/a/14712992/852208我考虑过将您的标题标记为重复项,但您的标题更简洁,因为它表明查询在 sql Developer 中运行得很快。我欢迎您提出有关以其他方式处理的建议。

将以下内容添加到您的配置中会将 odp.net 跟踪信息发送到日志文件:

只有当您能及时发现较大的时间差距时,这可能才会有帮助。有可能行实际上正在进入,只是速度较慢。

尝试将“enlist=false”添加到您的连接字符串中。我不认为这是一个解决方案,因为它有效地禁用了分布式事务,但它应该可以帮助您隔离问题。您可以从 Oracle 论坛帖子中获取更多信息:

From an ODP perspective, all we can really point out is that the behavior occurs when OCI_ATR_EXTERNAL_NAME and OCI_ATR_INTERNAL_NAME are set on the underlying OCI connection (which is what happens when distrib tx support is enabled).

我猜您没有看到的是 odp.net 调用和 sql Developer 调用之间的执行计划实际上是不同的(意味着实际的性能影响实际上发生在服务器上)。让您的 dba 跟踪连接并从 odp.net 调用和直接来自 SQL Developer 的调用(或使用 enlist=false 参数)获取执行计划。

如果确认不同的执行计划或者想在黑暗中先发制人,请更新相关表上的统计信息。在我的例子中,这纠正了这个问题,表明执行计划生成并没有真正遵循不同类型连接的不同规则,但当可能涉及分布式事务时,成本分析只是稍微悲观一些。强制执行计划的查询提示也是一种选择,但只能作为最后的手段。

最后,这可能是网络问题。如果您的 odp.net 安装使用新的 oracle 主目录(我希望除非您进行一些安装后配置),那么 tnsnames.ora 可能会有所不同。 tnsnams 中的主机名可能不完全限定,从而导致解析服务器时出现更多延迟。在这种情况下,我只希望第一次尝试(而不是后续尝试)会很慢,所以我不认为这是问题所在,但我认为应该提及它。

关于Oracle 绑定(bind)查询非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28434844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com