pb中不能用not in的问题

angloy 2012-03-22 10:29:54
我有一种情况pb用的是9.0,服务器上装的是64位的sql2008,有一句SQL语句,用的是
SELECT * from a where a.x + a.y NOT IN ( b.x + b.y from b ),在pb9.0中执行就会造成类似于死锁的情况,我去看服务器上CPU运行100%,但是同样这句SQL在sql2000中就能执行成功,同样这句话在sql2008的服务器上也能执行成功,但在PB环境中就会造成服务器死机,有没有人碰到这种情况的?
...全文
290 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kenshu 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 angloy 的回复:]
pb假死?那为什么服务器的cpu占有率会一直占100%?
[/Quote]

它在等服务器返回,服务器不给结果,它就一直阻塞在那里。

类似的ORACLE中(SQLSERVER我不熟)

select c1 from t1 where c2 not in (select c3 from t2 where my_where)



select t1.c1
from t1,(select * from t2 where my_where) as t2
where t1.c1 = t2.c3(+) and t2.c3 is null;//使用外连接


速度完全不在一个数量级上.

--------------------------------
当然,上述是数据库用到索引的情况下,像 c1+c2这种,数据库无法用到索引的情况,会导致慢很多。
kenshu 2012-03-22
  • 打赏
  • 举报
回复
你大致算一下,相同的SQL,在相同的数据库上(也就是前后两次查询的数量量一致)

直接在服务器上运行的时间,(留意,是CPU时间,而不是纯粹的时间,也就是任务管理器上的那个)

比如3分钟的CPU时间(这时前后的物理时间可能是4分钟了,因为会有许多IO操作)。

那你在PB上运行这条SQL,加上一点网络消耗,看看同样在服务器上的4分钟是否可以出来.
angloy 2012-03-22
  • 打赏
  • 举报
回复
pb假死?那为什么服务器的cpu占有率会一直占100%?
kenshu 2012-03-22
  • 打赏
  • 举报
回复
PB只是假死在那里.

如果你一定要用这个条件,用外联接会好很多.
angloy 2012-03-22
  • 打赏
  • 举报
回复
to kenshu:我也知道这种写法很不合适。只不过这个程序和数据库6、7年下来都能正常运行所以也没有认真考虑用别的更好的替代的方法。目前准备升级服务器所以把SQL2000升级到SQL2008了。现在测试的过程中发现了这个问题,我刚刚计算了下这两张表的容量,虽然表的数据比较大,但无论如何也不应该产生死锁的情况。况且我在查询分析器中进行检索就很顺利,而pb中就会假死。由于问题没有找到,我不知道这样升级之后会不会还有别的问题会产生,所以我希望能够明确的找到语句不能执行成功的原因
kenshu 2012-03-22
  • 打赏
  • 举报
回复
我不知道SQLSERVER中有没有"函数索引"的概念,大概就是有一个物理存储上,放着a.x+a.y的计算结果,拿它做索引才可以.
kenshu 2012-03-22
  • 打赏
  • 举报
回复
一般的情况下,你加了索引也没有用



如果你来写数据库系统,a.x + a.y你指望它用什么索引?必须一条条算.

除非你的索引是专门对着 a.x+a.y 建的函数索引.
angloy 2012-03-22
  • 打赏
  • 举报
回复
再补充一句,我在查询分析器中检索这句话没有问题,在pb中执行就是不行
kenshu 2012-03-22
  • 打赏
  • 举报
回复
单从SQL语法没有问题.

你所说的PB中会假死,是因为PB至少要等到有一条数据过来,或数据库最终告诉你"一条数据都没有",PB才会重绘一下屏幕.

你看到的假死是这个SQL非常费CPU.

这么写条件的,除非你只是在极小规模数据量的表上操作,不然多强的DMBS也不够你用.
angloy 2012-03-22
  • 打赏
  • 举报
回复
数据库是我从2000移到2008上来的。所以不存在索引的问题。而且我后来加了索引结果还是一样。而且奇怪的是我在服务器上执行确实能够成功,只是在pb中执行不能成功。另外主贴上的SQL语句我贴错了可能会造成大家误解,我在这里重新贴一下SELECT * from a where a.x + a.y NOT IN ( select b.x + b.y from b ),
sjlion 2012-03-22
  • 打赏
  • 举报
回复
最直接的办法,去服务器上查看实际执行的语句
noobw 2012-03-22
  • 打赏
  • 举报
回复
有些SQL在数据库服务器上运行的写法与在PB中的写法不一样,最好注意下。
fuxiaoyang13 2012-03-22
  • 打赏
  • 举报
回复
SELECT * from a where a.x + a.y NOT IN ( b.x + b.y from b ),

b.x + b.y from b ??少个SELECT 吧
xuam 2012-03-22
  • 打赏
  • 举报
回复
不是SQL语句的问题,是数据库的问题吧.加索引试试,
angloy 2012-03-22
  • 打赏
  • 举报
回复
还是结贴了吧,我也不再纠结这个问题了。其实解决的办法有很多,比如都用ODBC连又或者用xuan的建议把lock改成‘RC’,你贴出来的那个帖子我去看过了,不过我没测试过不知道我的问题和他得是否相同。我用了另外一种办法,就是修改了SQL语句。由于我用的not in的语句确实是效率最差的语句,我咨询了一些朋友最后确定用not exist来效率要高的多,而且在pb中也不再出现假死的状态。如此就这么算了吧
xuam 2012-03-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 angloy 的回复:]
to xuam:我也怀疑是驱动问题。因为我在pb中用MSS Microsoft SQL Server和ODBC都做了测试,结果发现ODBC中运行没有问题。貌似MSS Microsoft SQL Server驱动发生了错误。但是如果都改成ODBC又有点不甘心,程序要改了,而且每个客户端还得去配置。有没有好的办法解决?
[/Quote]
sqlca.lock = 'RC'
xuam 2012-03-22
  • 打赏
  • 举报
回复
SQL2000是支持直连的,而SQL2005以上就不是直连的方式了
参考此帖:http://topic.csdn.net/u/20091202/11/692F7FE6-6D33-4081-8FB7-A58920D4061C.html#r_61585582

[Quote=引用 17 楼 angloy 的回复:]
to xuam:我也怀疑是驱动问题。因为我在pb中用MSS Microsoft SQL Server和ODBC都做了测试,结果发现ODBC中运行没有问题。貌似MSS Microsoft SQL Server驱动发生了错误。但是如果都改成ODBC又有点不甘心,程序要改了,而且每个客户端还得去配置。有没有好的办法解决?
[/Quote]
angloy 2012-03-22
  • 打赏
  • 举报
回复
to xuam:我也怀疑是驱动问题。因为我在pb中用MSS Microsoft SQL Server和ODBC都做了测试,结果发现ODBC中运行没有问题。貌似MSS Microsoft SQL Server驱动发生了错误。但是如果都改成ODBC又有点不甘心,程序要改了,而且每个客户端还得去配置。有没有好的办法解决?
xuam 2012-03-22
  • 打赏
  • 举报
回复
估计是连数据库方式的问题,换ODBC试试,或者其他....
kenshu 2012-03-22
  • 打赏
  • 举报
回复
上面条件打错了,c2 = c3(+) ,就是外联接,不管C3中有没有,只要c2有就列出来.

where t1.c2 = t2.c3(+) and t2.c3 is null;

1,077

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧