一句并不复杂的select导致的CPU100%....

大P 2008-12-01 03:00:26
select a,b from table1 inner join table2 on table1.a=table2.a
and table1.b=table2.b where time>getdate()-15 and time<=getdate()
and not exists ( select 1 from BIGtable where BiGtable.a=table1.a and BiGtable.b=table1b)


这样一个简单逻辑的查询...= =只要我执行 MSSQL2000的CPU立马100%....16核的CPU+8G内存....而且很长一段时间都属于loading状态...机器为IBM 3950
table1有160M,数据量有60W条
table2有400M ,数据量有50W条左右
Bigtable有450M,数据量50W条....
table1 用来join的两个关键字建了聚集索引 其他两个表的都是ID为主键....

我估计查询得出的结果在2W条记录左右....让人纳闷的是 为什么一查询就会CPU100%呢= =...
开始觉得应该是table2 和BIGtable没有做好 聚集索引....
但是做这个索引与否能起到如此大的差别吗??
更何况Not exists也一样会扫描表...
我看了执行计划
inner join table2消耗了将近50%的资源
最后的not exists Bigtable 也消耗了将近50%.....

大虾们能一起讨论讨论吗...

...全文
285 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
大P 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jinjazz 的回复:]
海量数据在无法利用索引的查询下会让cpu达到100%
[/Quote]


...恩!!很精简的总结..! 俺结贴了..谢谢楼上的各位!!!~ 预祝大家新年快乐!
大P 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fcuandy 的回复:]
这几个表之前是一对一的还是多对一?
[/Quote]
每个表都是a,b确定一条唯一记录...
3表之间都是1对1
大P 2008-12-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 flairsky 的回复:]
select 1 from BIGtable where BiGtable.a=table1.a and BiGtable.b=table1b

这一句的关联集合非常大……因为table1.a与table1b没有关系,也就是笛卡尔集了……,再来据not exists,肯定慢了
[/Quote]

=.=这里没有笛卡尔集...每个表的a与b都可以确定一条唯一记录
jinjazz 2008-12-01
  • 打赏
  • 举报
回复
海量数据在无法利用索引的查询下会让cpu达到100%
tianhuo_soft 2008-12-01
  • 打赏
  • 举报
回复
表太大了
等不到来世 2008-12-01
  • 打赏
  • 举报
回复
数据量到达一个瓶颈
  • 打赏
  • 举报
回复
觉得需要对sql语句进行一些优化吧。

精华帖里面有两篇相关的帖子,
http://topic.csdn.net/u/20080509/10/c9bee345-3f57-4632-a84d-1673b1e96bf8.html
http://blog.csdn.net/Haiwer/archive/2008/08/25/2826881.aspx
fcuandy 2008-12-01
  • 打赏
  • 举报
回复
这几个表之前是一对一的还是多对一?
flairsky 2008-12-01
  • 打赏
  • 举报
回复
select 1 from BIGtable where BiGtable.a=table1.a and BiGtable.b=table1b

这一句的关联集合非常大……因为table1.a与table1b没有关系,也就是笛卡尔集了……,再来据not exists,肯定慢了
dawugui 2008-12-01
  • 打赏
  • 举报
回复
1\尽量避免使用not exists ,exists , in等.
2\如果要用,尽量把not exists ,exists , in子查询的结果集弄小点,例如你上面的加条件控制子查询的结果.
大P 2008-12-01
  • 打赏
  • 举报
回复

= =..我在最后的地方not exists ( select 1 from BIGtable where BiGtable.a=table1.a and BiGtable.b=table1b where time>= and time <= )
加上时间的条件 把这个BigTable 50W的数据量 缩短到12W左右..

2秒内就出了结果...

= =不过至于吗??50W与10W相差得也太大了....

没有where 条件 就CPU100% 附带很长一段LOADING时间(至少大于1分钟)...

加上去2秒就出来了...

=.=...纳闷ING..我1天后结贴...大伙能讨论一下吗..
dawugui 2008-12-01
  • 打赏
  • 举报
回复
各表都是几十万条?且相关连接,还存在not exists,估计差不多了,要死不死的了.

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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