首页 新闻 会员 周边

关于Micorsoft SQL Server 2008 中的SQL问题

0
悬赏园豆:100 [已解决问题] 解决于 2013-12-31 17:51

1. SELECT TOP 1000 a,b,c,d FROM tb WITH (NOLOCK) WHERE a=1

2. SELECT TOP 1000 a,b,c,d FROM tb WITH (NOLOCK) WHERE a=1 and b=2 and c=3

数据量:10亿条记录

分区列:a (tiyint) 

b和c都为bigint

CPU和IO都没有问题

问题:

第一条SQL执行没有问题

第二条SQL出现超时,执行大于150s都没有完成

执行计划任务(3千万数据)查看过,没有问题.

请问各位码友,这是何缘故,还望指点一番

風吹云动的主页 風吹云动 | 初学一级 | 园豆:69
提问于:2013-12-28 17:23
< >
分享
最佳答案
0

是MS SQL 统计信息导致会扫描全表,而出现SQL超时,谢谢各位

風吹云动 | 初学一级 |园豆:69 | 2013-12-31 17:51
其他回答(4)
0

没有索引,超时

And一下判断要多出一倍的运算.只有一个a=1的时候,他可以先排序再获取会快很多.

多了2个and Sql优化不了,造成性能低下的把

猜的```

收获园豆:20
吴瑞祥 | 园豆:29449 (高人七级) | 2013-12-28 17:26

是否和存储硬盘满了有关系

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2013-12-28 17:40
0

建立包含a, b, c三个字段的复合索引

收获园豆:20
dudu | 园豆:30943 (高人七级) | 2013-12-28 20:08

数据量太大了,没办法再建索引,而且建复合所以也是很占空间,之前都OK,这会不会和MDF文件存放盘快满了有关系呢?

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2013-12-29 00:04

@抽烟的烦恼: 怎么会没办法建索引?

支持(0) 反对(0) dudu | 园豆:30943 (高人七级) | 2013-12-29 11:02
0

再下一条语句:SELECT TOP 1000 a,b,c,d FROM tb WITH (NOLOCK) WHERE  b=2 再看看结果,感觉是和你的数据类型有关...

收获园豆:30
幻天芒 | 园豆:37175 (高人七级) | 2013-12-28 23:49

一样都是超时,只有用分区列来判断次才可以行,应该 MS SQL 统计信息重建,导致要全表扫表

支持(0) 反对(0) 風吹云动 | 园豆:69 (初学一级) | 2013-12-31 17:48
0

这个问题,也不敢直接下定论,毕竟数据量有这么大,查询的IO开销肯定也很高,这么大数据量稍微一个小的条件都可能导致超时。只能是 你通过查看执行计划 IO 开销 sql 执行时间 来排查问题,

 

收获园豆:30
Zery | 园豆:6151 (大侠五级) | 2013-12-30 09:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册