我有以下情况
main()
{
hnd = CreateTHread( func1 );
// Call fun2()
wait(hnd);
return ;
}
fun2()
{
//Access database to perform some read operation on TAble A
}
func1()
{
//Access database to perform some read operation on TAble A
// Recursive operations
}
我观察到的是,如果我使用线程方法,fun2()
需要更长的时间才能完成。可能是因为THread func和fuc2正在同一个表上工作。注意,两个函数中只有读操作。 AWR报告表明,当使用线程方法时,查询exectutions的数量增加
答案 0 :(得分:1)
类似的问题 - Multi-threaded database read access
Oracle JDBC接口以及Oracle本机驱动程序(我想)能够处理多线程请求(http://www.cs.umbc.edu/portal/help/oracle8/java.815/a64685/tips1.htm)
然而,当涉及到数据库引擎中的实现时 - 这一点尚不清楚。从当前文档中我的理解是,只要您的请求是READONLY而无意更新就不会发生锁定,您应该看到性能提升(至少是次要的)。
然而,还有许多其他因素决定了引擎是否会使用并行性。服务器(多核)等的硬件配置还可以确定查询引擎是否采用并行或排队方法。
顺便说一句,你尝试过的两种方法中你的观察时间差异有多大。您的数据量是多少?
答案 1 :(得分:1)
尝试将隔离级别更改为READ COMMITTED,并使用READ ONLY“子句”进行查询。它应该限制较少,并允许您同时读取相同的表。
答案 2 :(得分:1)
尝试使用两种不同的连接。多线程相同的连接访问同一个表总是会降低性能,你会给连接带来压力。您没有说明使用哪个驱动程序进行访问,但我在Oracle 10中使用JDBC驱动程序测试了类似的方法,并且性能下降,我猜如果使用相同的连接,SQL命令会逐渐流水线化。
答案 3 :(得分:0)
并发总会让你失去性能。如果你需要并发,你将不得不忍受这种情况;如果你不需要它,你就不应该使用它!
SQL中的某些操作(如“count”)在表中执行LOCK。你能分享你的SQL吗?