您好我有一个Oracle系统查询,它涉及一个视图,它通过将TO_NUMBER()与表主键相关联来连接其他表.
如果我使用TOAD进行查询,查询速度非常快(800 regs为1秒).如果我在JDBC程序中使用String文字(不是参数化查询)在java程序中执行相同的查询,那么时间也很好.
但是如果我使用PreparedStatement的参数化查询,则查询需要1分钟来获取相同的寄存器.我知道使用常量值会产生与使用参数不同的执行计划...但是如果我删除视图连接中的TO_NUMBER函数,则参数化查询也很快.
PD sry我的英语不好
这个让我很困惑.我编写了一个从我的开发客户端运行良好的查询但在生产客户端上失败并出现错误"ORA-01652:无法扩展临时段......".在这两种情况下,数据库和用户都是相同的.在我的开发机器(MS Windows)上,我有SQL*PLUS(版本9.0.1.4.0)和Toad 9.0(都使用了oci.dll的9.0.4.0.1版本).两者都运行代码没有错误.
但是,当我在同一个数据库上运行相同的文件时,使用来自不同机器的相同用户名/密码,这次版本10.2.0.4.0(来自10.2.0.4-1 Oracle即时客户端)我收到错误.
它确实可重复发生.
不幸的是,我只能访问数据库上的字典视图,这些视图设置为只读(甚至无法获得解释计划!).
我试过通过调整查询来解决这个问题(我怀疑有一个大的中间结果集随后被修剪掉了)但是没有设法改变任何一个客户端的行为.
有可能在计算机上部署不同版本的客户端导致问题 - 但目前看起来像是降级到以前的版本.
有任何想法吗?
TIA
根据Gary的回答,我看了一下glogin.sql脚本 - 唯一的区别是'SET SQLPLUSCOMPATIBILITY 8.1.7'在工作客户端上存在但在失败的客户端上没有 - 但添加它并没有解决问题.
我也试过了
alter session set workarea_size_policy=manual;
alter session set hash_area_size=1048576000;
Run Code Online (Sandbox Code Playgroud)
和
alter session set sort_area_size=1048576000;
Run Code Online (Sandbox Code Playgroud)
无济于事:(
我设法找到了相同的行为,这次是与Oracle 8i后端交谈.在这种情况下,数据库是RW.这让我可以确认,正如我所怀疑的那样,不同的客户会产生不同的计划.但为什么????
看看'SHOW PARAMETERS'的输出,两个客户都报告了完全相同的设置!