boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Database版 - 问一个可能看起来很怪的问题
相关主题
JDBC<======================>Oracle8i
数据库问题一问
how to improve the performance of Oracle Insert operation?
ORACLE Pro*C 远程接续一问?
Oracle8i能装在Win2000下吗?
老板的无理要求!(希望熟悉Oracle的朋友指点)
请教一下怎么把javadb的数据导入到oracle中
用了ORACLE才懂得为啥SQL SERVER流行了
问一下oracle高手
CINAOUG 2011 年数据库入门与就业系列讲座 session 2&3 makeup
相关话题的讨论汇总
话题: session话题: insert话题: oracle话题: delete话题: update
进入Database版参与讨论
1 (共1页)
f*********e
发帖数: 8453
1
我们公司用Oracle。然后用ibm的一个叫record manager的产品
管理纪录。要处理非常大量的表项。产品里有api进行数据添加
和删除。我们写了个ejb每天固定时间做这些操作。可是在极少
数情况下会出现异常退出。看错误信息是由于duplicate relationship
target name。对应于oracle好象是因为有同样表项已经存在。
我看了一下代码,导致出错的代码段是要进行数据库更新,由于
performance的需要,该段代码先在数据库里删除要
添加的表项,然后立刻添加该项。因为直接更新要花比这两个操作
更长的时间(听起来有点怪,但事实如此)。我们数据库里有大量
数据需要进行更新操作,也就是说要做大量先删除紧接着添加。
啰嗦了这么一大堆,我的问题是有没有可能oracle在删除的时候
没有立即commit才导致产生重复项错误。thx.
B*****g
发帖数: 34098
2
can you post oracle error number? ora-xxxxx
BTW, why not use pl/sql to do this job?

【在 f*********e 的大作中提到】
: 我们公司用Oracle。然后用ibm的一个叫record manager的产品
: 管理纪录。要处理非常大量的表项。产品里有api进行数据添加
: 和删除。我们写了个ejb每天固定时间做这些操作。可是在极少
: 数情况下会出现异常退出。看错误信息是由于duplicate relationship
: target name。对应于oracle好象是因为有同样表项已经存在。
: 我看了一下代码,导致出错的代码段是要进行数据库更新,由于
: performance的需要,该段代码先在数据库里删除要
: 添加的表项,然后立刻添加该项。因为直接更新要花比这两个操作
: 更长的时间(听起来有点怪,但事实如此)。我们数据库里有大量
: 数据需要进行更新操作,也就是说要做大量先删除紧接着添加。

w*r
发帖数: 2421
3
because JAVA is better:D

【在 B*****g 的大作中提到】
: can you post oracle error number? ora-xxxxx
: BTW, why not use pl/sql to do this job?

f*********e
发帖数: 8453
4
抱歉,没看到oracle error number,估计是被ibm的产品吞掉了,
然后wrap起来给了我说的错误。我看到的最接近oracle的错误信息是:
AT com.ibm.gre.engine.dao.oracle.RelationshipORADAO.insert: line -3
这个可能用处不大.
我们用的那个record manager提供了API,所以就没直接用pl/sql。

【在 B*****g 的大作中提到】
: can you post oracle error number? ora-xxxxx
: BTW, why not use pl/sql to do this job?

I******e
发帖数: 101
5
Is delete/insert in the same session?

【在 f*********e 的大作中提到】
: 我们公司用Oracle。然后用ibm的一个叫record manager的产品
: 管理纪录。要处理非常大量的表项。产品里有api进行数据添加
: 和删除。我们写了个ejb每天固定时间做这些操作。可是在极少
: 数情况下会出现异常退出。看错误信息是由于duplicate relationship
: target name。对应于oracle好象是因为有同样表项已经存在。
: 我看了一下代码,导致出错的代码段是要进行数据库更新,由于
: performance的需要,该段代码先在数据库里删除要
: 添加的表项,然后立刻添加该项。因为直接更新要花比这两个操作
: 更长的时间(听起来有点怪,但事实如此)。我们数据库里有大量
: 数据需要进行更新操作,也就是说要做大量先删除紧接着添加。

f*********e
发帖数: 8453
6
不好意思,不太明白你说的session具体指什么。
不过这两个操作是同一个程序段紧挨着的两行代码.

【在 I******e 的大作中提到】
: Is delete/insert in the same session?
I******e
发帖数: 101
7
Still not sure whether they are in the same session.
Session means your JDBC or ODBC or other interface opens a connection to the
database. If one session delete, the other session insert. Even though
the deleted session committed, the insert session can still see the deleted
row after. This is by design in Oracle.
If you guarantee that your delete/insert are in the same session, you need
to make sure that your commit succeeded.
For update slow issue, it is most likely caused by rollback segm
c*****d
发帖数: 6045
8
“同一个程序段紧挨着的两行代码”
程序是这样的吗?
Connection conn ...;
Statement stmt;
...
stmt.execute("delete ... ");
stmt.execute("insert ... ");
...
stmt.close();
conn.close();
这样的话应该是一个session

【在 f*********e 的大作中提到】
: 不好意思,不太明白你说的session具体指什么。
: 不过这两个操作是同一个程序段紧挨着的两行代码.

c*****d
发帖数: 6045
9
update慢的原因有很多
1. update的表没有索引,或者没有用索引
2. update产生row migration
3. 其他session在更新同样的记录,等待锁的释放
4. 回滚段太小
前两个原因会导致update比delete+insert慢
后两个原因不能导致update比delete+insert慢
将大tranx拆成小tranx,可以减少回滚段的动态extend
不过他们这种情况下问题的症结应该不是回滚段

the
deleted

【在 I******e 的大作中提到】
: Still not sure whether they are in the same session.
: Session means your JDBC or ODBC or other interface opens a connection to the
: database. If one session delete, the other session insert. Even though
: the deleted session committed, the insert session can still see the deleted
: row after. This is by design in Oracle.
: If you guarantee that your delete/insert are in the same session, you need
: to make sure that your commit succeeded.
: For update slow issue, it is most likely caused by rollback segm

f*********e
发帖数: 8453
10
我不是直接用的jdbc调用,而是用ibm那个records manager产品提供的api。
psudo代码是这样的(箭头标出的是和数据库通讯语句。我昨天记错了,不是紧接的
两句,中间有一些无关数据库操作的函数调用):
-> this.DeleteTarget(Id, ... parameters);
try {
OutString = getEmptyStruct;
InputXmlDoc = ChangeToXML(OutString);
PopulatedXMLDoc = PopulateXMLStruct(InputXmlDoc);
InputStr = ChangeToString(PopulatedXmlDoc);
ValidateController();
-> CaseId = InsertTarget(InputStr);
}
我觉得基本上算是同一个session。但不知道ibm的api怎么写的。

【在 c*****d 的大作中提到】
: “同一个程序段紧挨着的两行代码”
: 程序是这样的吗?
: Connection conn ...;
: Statement stmt;
: ...
: stmt.execute("delete ... ");
: stmt.execute("insert ... ");
: ...
: stmt.close();
: conn.close();

相关主题
ORACLE Pro*C 远程接续一问?
Oracle8i能装在Win2000下吗?
老板的无理要求!(希望熟悉Oracle的朋友指点)
请教一下怎么把javadb的数据导入到oracle中
进入Database版参与讨论
f*********e
发帖数: 8453
11
多谢你和InnoBase的回答。这对我分析问题很有帮助。
我们用的这个产品自己管理和设计oracle数据库。所以我也不太清楚是不是
用了索引。
你说的row migration是什么意思?是不是说比如更新的时候导致原来的第三行
变成了第四行?

【在 c*****d 的大作中提到】
: update慢的原因有很多
: 1. update的表没有索引,或者没有用索引
: 2. update产生row migration
: 3. 其他session在更新同样的记录,等待锁的释放
: 4. 回滚段太小
: 前两个原因会导致update比delete+insert慢
: 后两个原因不能导致update比delete+insert慢
: 将大tranx拆成小tranx,可以减少回滚段的动态extend
: 不过他们这种情况下问题的症结应该不是回滚段
:

c*****d
发帖数: 6045
12
Not 更新的时候导致原来的第三行变成了第四行.
Row migration occurs when an update to the row would cause the row not to
fit in the block anymore. The entire row will move to another block. The
original block just has the rowid of the new block.

【在 f*********e 的大作中提到】
: 多谢你和InnoBase的回答。这对我分析问题很有帮助。
: 我们用的这个产品自己管理和设计oracle数据库。所以我也不太清楚是不是
: 用了索引。
: 你说的row migration是什么意思?是不是说比如更新的时候导致原来的第三行
: 变成了第四行?

I******e
发帖数: 101
13
I hope that it is not so bad:)
In general, it is uncommon for correct designed schemas.
A way update is slow is because insert can be done with index maintenance
delayed insert. Update can
not do that. Small transactions can alleviate the problem.
I******e
发帖数: 101
14
Then, the possibility is whether the delete really deleted all rows to be
inserted. Can you verify that?

【在 f*********e 的大作中提到】
: 我不是直接用的jdbc调用,而是用ibm那个records manager产品提供的api。
: psudo代码是这样的(箭头标出的是和数据库通讯语句。我昨天记错了,不是紧接的
: 两句,中间有一些无关数据库操作的函数调用):
: -> this.DeleteTarget(Id, ... parameters);
: try {
: OutString = getEmptyStruct;
: InputXmlDoc = ChangeToXML(OutString);
: PopulatedXMLDoc = PopulateXMLStruct(InputXmlDoc);
: InputStr = ChangeToString(PopulatedXmlDoc);
: ValidateController();

f*********e
发帖数: 8453
15
可以用程序来验证,但是会影响程序的performance。
不过在我现在找错阶段还是很有用的。不走运的是这种错误
好像很难再现,实在不好查错。

【在 I******e 的大作中提到】
: Then, the possibility is whether the delete really deleted all rows to be
: inserted. Can you verify that?

B*****g
发帖数: 34098
16
can you get alert log from oracle?

【在 f*********e 的大作中提到】
: 可以用程序来验证,但是会影响程序的performance。
: 不过在我现在找错阶段还是很有用的。不走运的是这种错误
: 好像很难再现,实在不好查错。

f*********e
发帖数: 8453
17
我也想问问DBA,可是DBA不是我们公司的,而且不知道有没有这么个log文件。听别人说
好像所有的数据库操作都会产生一个log,不知道是不是这样?

【在 B*****g 的大作中提到】
: can you get alert log from oracle?
c*****d
发帖数: 6045
18
数据库的启动,关闭有一个Log,文本的,可以直接看
数据库的insert/update/delete会写在log file里,这个是2进制的,不能直接看

人说

【在 f*********e 的大作中提到】
: 我也想问问DBA,可是DBA不是我们公司的,而且不知道有没有这么个log文件。听别人说
: 好像所有的数据库操作都会产生一个log,不知道是不是这样?

c*****d
发帖数: 6045
19
你要alert log干吗?
如果是insert duplicate pk,不会写到alert里

【在 B*****g 的大作中提到】
: can you get alert log from oracle?
f*********e
发帖数: 8453
20
谢谢,可是如果插入删除的纪录是二进制的文件该怎么看呢?
是不是有什么工具跟着Oracle来的用于看这种log呢?

【在 c*****d 的大作中提到】
: 数据库的启动,关闭有一个Log,文本的,可以直接看
: 数据库的insert/update/delete会写在log file里,这个是2进制的,不能直接看
:
: 人说

f*********e
发帖数: 8453
21
也许Beijing说的就是你说的那个插入删除的纪录文件。

【在 c*****d 的大作中提到】
: 你要alert log干吗?
: 如果是insert duplicate pk,不会写到alert里

1 (共1页)
进入Database版参与讨论
相关主题
CINAOUG 2011 年数据库入门与就业系列讲座 session 2&3 makeup
Set autocommit off
Teradata account locking issue
ODBC
Help on JDBC:ODBC SOS
how to establish sun.jdbc.odbc.JdbcOdbcDriver
JDBC-ODBC Bridge supporting JDBC API 2.0?
Question
web based database?
Question about Oracle Driver
相关话题的讨论汇总
话题: session话题: insert话题: oracle话题: delete话题: update