我正在处理访问Sybase ASE 15.0.2的应用程序,其中当前代码访问远程数据库 (CIS)使用代理表定义插入行(目标表是DOL - DRL表 - PK row被定义为identity,并且总是在增长)。当前代码执行选择以检查行 已存在以避免插入重复数据。
由于远程表在表上也有PK定义,我明白PK验证会 在提交行之前再次完成。 我计划删除选择检查,因为它通过PK验证再次有效地完成, 但我担心如果收到一个有很多重复的文件,表可能会受到影响 尝试提交数据时发生一些不必要的争用。
我不清楚Sybase ASE是否尝试保留最后一行并在检查之前写入数据 重复。此外,如果表非常大,我也关心它将花费的时间 整个索引找到重复。
我在任何地方都找到了一些SQL文档,但在以下链接中没有找到ASE http://dcx.sybase.com/1200/en/dbusage/insert-how-transact.html
我能找到的最好的是以下解释
https://groups.google.com/forum/?fromgroups#!topic/comp.databases.sybase/tHnOqptD7X8
但它没有详细说明行是如何被锁定的(如果有任何类型的话) 优化以提前写入或在PK检查的同时编写) ,如果它会浪费一个完整的PK看,如果我积极插入一个PK的行 肯定大于最后一行提交
由于
亚历
答案 0 :(得分:0)
与SqlAnywhere不同,ASE没有选项来设置wait_for_commit
。在插入期间而不是在提交时检查主键约束。我从你的帖子中了解到的问题是,如果你有一个可能包含重复项的文件的大量插入,则加载到临时表中,检查重复项,删除重复项,然后插入唯一的副本。尽管仍然检查主键违规,但批量插入速度要快得多。但是没有相关的成本,因为没有回滚。 insert语句总是全有或全无。即使一行重复,整个insert语句也会失败。插入之前检查更多的无错误方法,而不是使用约束来验证,因为它将失败并且回滚将再次成本高昂。
答案 1 :(得分:0)
谢谢迈克 该链接确实从CIS角度对插入进行了非常快速的解释。鉴于CIS可能成为具有代表性的时间消费者,这是一个值得关注的变量 如果它执行数据和语法检查,当CIS将insert语句转发到目标服务器时它是否会再次执行。我担心CIS可能会在网络流量/时间之外对锁定/ PK检查产生一些影响
拉朱 我同意通过运行select并批量执行来检查行是否已存在来避免PK重复,但我目前正在寻找一个停止间隙解决方案,这可能是以大约50行的批量执行insert命令离开了 重复密钥检查PK。 希望PK检查将通过50个新插入行的连接完成,因此 避免遍历每一行的索引......
我试着测试一下并发表评论
亚历