我正在使用JDBC驱动程序“oracle.jdbc.driver.OracleDriver”服务器URL的传递方式为:“jdbc:oracle:精简:@//服务器:端口/VMP”
我在表中有3列:
此外,表上只有一个主键索引。
查询为:
SELECT SN_SERIALNR,
SN_ORDER_ID
FROM test_table
WHERE SN_SITE_ID=1
AND SN_ORDER_ID='xxx'
当我在SQL开发者中运行查询时,它需要大约500 ms来执行。但是当我从外部程序中执行查询并使用JDBC运行它时,它需要大约4000 ms。
添加具有SN_SITE_ID和SN_ORDER_ID的索引SN_SERIALNR可将SQL开发人员查询时间缩短到300毫秒,但不会更改JDBC执行。
我的测试显示,如果列类型更改为varchar 2而不是nvarchar,JDBC调用的执行持续时间将减少到sql开发人员的持续时间。
您知道如何在不更改列数据类型的情况下改进JDBC调用的持续时间吗?
该表包含大约130万行,测试的SN_ORDER_ID的查询结果包含3700行
为了执行查询,我使用函数“Execute batch”(执行批处理)(右键)
最初,我注意到SAPMII应用程序中的性能问题,在该软件中,我有两个选项来执行查询
1.使用类型化的参数为变量查询生成一个准备好的语句。在那里我可以选择“String”作为变量数据类型(nvarchar和varchar没有区别)
1.不使用变量执行,并将查询直接发送到DBMS。
在不带变量的第二个选项中,查询在nvarchar列方面的运行速度也提高了10倍。
有没有可能强制JDBC总是对字符串使用nvarchar?我的整个数据模型对字符串值使用nvarchar,所以做这样的设置不会有问题。
由于注解中的提示,我检查了绑定。参数:2是一个varchar 2。运行时间是4秒。
由于未知的原因,现在查询在开发系统上要快得多(我准备的数据与生产系统上的数据相同)
- 相同的绑定、相同的结果以及varchar 2
- 在“缓慢”的生产系统上,如果不使用预准备语句,查询执行速度仍然非常快
生产系统,不使用绑定:54 ms运行时间x1c4d 1x
具有绑定的开发系统:消耗时间为10 ms,而不是4000 ms(生产系统)。
第一节第五节第一节第六节第一节
1条答案
按热度按时间vddsk6oq1#
如果使用绑定变量,并且在列为varchar2时将其键入为nvarchar2(反之亦然),Oracle必须对该列应用内部转换函数,使其与绑定变量的数据类型匹配,以便能够将其与绑定变量值进行比较。该隐式函数禁用索引的使用。
因此,使JDBC端的绑定变量与数据库中的列数据类型相匹配是正确的解决方案,不应强迫您更改表......必须有一种方法在客户端选择适当的绑定变量类型。
如果你想更准确地诊断出问题所在,只需查询
v$sql
,在共享池中找到你的SQL语句,得到sql_id
,然后查询v$sql_bind_capture WHERE sql_id = {your sql id}
,查看每个绑定变量的数据类型,并与你的表中相应列的数据类型进行比较,如果它们不完全相同,那就是你的问题所在。