| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8207 人关注过本帖
标题:300万条数据,3张表联合查询 select top 8 要8秒多,怎么提高查询效率?
取消只看楼主 加入收藏
sw4433
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2009-5-24
结帖率:44.44%
收藏
已结贴  问题点数:20 回复次数:6 
300万条数据,3张表联合查询 select top 8 要8秒多,怎么提高查询效率?
select top 8 n.id,n.title,n.createTime,c.[name],count(com.id) as comCount,
    c.id as caId
    from news n
    left join category c on n.caId = c.id --inner join速度慢
    left join comment com on com.newsId = n.id
    group by n.id,n.title,n.createTime,c.[name],c.id
    order by comCount desc

总共3张表 news(新闻表),category(分类表),comment(评论表)

-- 100万条数据  2秒多

-- 300万条数据  8秒多

时间有点长,效率态低,怎么解决啊?
搜索更多相关主题的帖子: 查询 数据 效率 top select 
2010-09-17 07:14
sw4433
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2009-5-24
收藏
得分:0 
建了索引了 title 和 createTime

2010-09-17 21:08
sw4433
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2009-5-24
收藏
得分:0 
以下是引用cnfarer在2010-9-17 08:30:56的发言:

 order by comCount desc这样在三表连接后再处理似乎不得不慢。
可以考虑先从comment表来入手,用子查询试试。
子查询怎么改?
group by n.id,n.title,n.createTime,c.[name],c.id 这个是必须的啊,少一个就会报错!
2010-09-17 21:13
sw4433
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2009-5-24
收藏
得分:0 
以下是引用gupiao175在2010-9-17 15:28:50的发言:

楼主的机子配置不错啊,强悍!

我的845机器,512内存,200万的3表联合查询就可能会当机!更别说300万了。估计一执行就死机!
945 3G内存

几百万数据没什么问题,就是时间长点
2010-09-17 21:14
sw4433
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2009-5-24
收藏
得分:0 
以下是引用cnfarer在2010-9-17 08:30:56的发言:

 order by comCount desc这样在三表连接后再处理似乎不得不慢。
可以考虑先从comment表来入手,用子查询试试。
有类似的sql语句吗?

group by n.id,n.title,n.createTime,c.[name],c.id
    order by comCount desc

group by 。。。是必须的啊
order by comCount desc 我是想根据评论的数量排序啊

有类似的多表查询的实例吗? 要能查询几百万甚至上亿千万数据的
2010-09-17 21:33
sw4433
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2009-5-24
收藏
得分:0 
我想查询评论最多 的newsid
select  top 8 com.newsId , count(id) as countId  from comment com
    where not exists(select 1 from comment where newsId = com.newsId and id>com.id)
    group by com.newsId
    order by countId desc
查询结果好像不对

查询评论最多的前几条数据的 newsid,
比如说
newsid :
99451
39
39
46
39
46
99451
99451
99451
99490
1000000
99451
47
47
47
47
47
47
我要的结果:  按评论最多到最少排序
47 (6条评论)
99451 (5条评论)
39 (3条评论)
46 (2条评论)

sql语句应该怎么写?
2010-09-20 09:16
sw4433
Rank: 1
等 级:新手上路
帖 子:65
专家分:0
注 册:2009-5-24
收藏
得分:0 
搞定了!
下面是原来的sql语句:
news(新闻表),category(分类表),comment(评论表) 都与news表有主外键关系
这是原来的sql语句   (查询时间8秒左右,而且 CUP 占用率很高!)
select top 8 n.id,n.title,n.createTime,c.[name],count(com.id) as comCount,
    c.id as caId
    from news n
    left join category c on n.caId = c.id
    left join comment com on com.newsId = n.id
    group by n.id,n.title,n.createTime,c.[name],c.id
    order by comCount desc

这是根据 版主 cnfarer 的建议改进过的sql语句   (查询时1秒不到,接近0秒)
查询前8条评论最多的新闻
select n.id,n.title,n.createTime,c.[name],c.id as caId
    from news n
    left join category c on n.caId = c.id
    where n.id in
    (
        select top 8  newsId from comment com
         group by com.newsId
        order by count(newsid) desc
    )
感谢
版主 cnfarer  !!
2010-09-23 10:43
快速回复:300万条数据,3张表联合查询 select top 8 要8秒多,怎么提高查询效率 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015787 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved