0

我正在开发一个访问 Sybase ASE 15.0.2 的应用程序,其中当前代码访问远程数据库 (CIS) 以使用代理表定义插入一行(目标表是 DOL-DRL 表-定义了 PK 行作为身份,并且一直在增长)。当前代码执行选择以检查该行是否已存在以避免插入重复数据。

由于远程表在表上也有一个 PK 定义,我知道在提交该行之前将再次完成 PK 验证。我计划删除选择检查,因为它通过 PK 验证再次有效地完成,但我担心如果在接收具有许多重复的文件时,当尝试提交数据时,表可能会遭受一些不必要的争用。

我不清楚 Sybase ASE 是否尝试保留最后一行并在检查重复项之前写入数据。此外,如果表非常大,我还担心查找整个索引以查找重复项所花费的时间。

我在任何地方都找到了一些 SQL 文档,但在以下链接 http://dcx.sybase.com/1200/en/dbusage/insert-how-transact.html中没有找到 ASE

我能找到的最好的是以下解释

https://groups.google.com/forum/?fromgroups#!topic/comp.databases.sybase/tHnOqptD7X8

但是它并没有详细说明该行是如何锁定的(以及是否有任何类型的优化可以提前或在 PK 检查的同时编写),以及如果我积极插入是否会浪费完整的 PK 外观PK 正大于提交的最后一行的行

谢谢

亚历克斯

4

2 回答 2

0

谢谢 Mike 该链接确实从 CIS 的角度对插入进行了非常快速的解释。如果 CIS 执行数据和语法检查,当 CIS 将插入语句转发到目标服务器时,它是否会再次执行,它可能会成为一个有代表性的时间消费者,因此它是一个需要关注的变量。我担心 CIS 会对锁定/PK 检查产生超出网络流量/时间的影响

Raju 我确实同意通过运行 select 并批量执行检查行是否已经存在来避免 PK 重复,但我目前正在寻找一个权宜之计的解决方案,这可能是分批执行大约 50 个插入命令行并留下 PK 的重复键检查。希望 PK 检查将在 50 个新插入的行的连接上完成,从而避免遍历每一行的索引......

我会尝试对此进行测试并发表评论

亚历克斯

于 2013-06-04T18:20:51.683 回答
0

与 SqlAnywhere 不同,ASE 没有设置选项wait_for_commit。在插入期间而不是在提交时检查主键约束。我从您的帖子中了解到的问题是,如果您从可能包含重复项的文件中进行批量插入,请加载到临时表中,检查重复项,删除重复项,然后插入唯一的。尽管它仍然检查主键违规,但批量插入要快得多。但是,没有相关成本,因为没有回滚。插入语句总是全有或全无。即使一行重复,整个插入语句也会失败。在插入之前检查更多的无错误方法,而不是对验证使用约束,因为它会失败并且回滚将再次变得昂贵。

于 2013-06-04T01:33:01.257 回答