首页 新闻 会员 周边 捐助

关于查询一张很久不会变化的表,提高效率的问题

0
[已解决问题] 解决于 2016-10-11 10:27

如题,我有一张大概1000万条数据的表,这个表的记录一个月都不会变化一次,查询语句类似num between xxx and xxx or num between xxx and xxx,每次会查询出来一批数据,暂时懂得只有SQL语句查询数据库和一次性把数据读取到DataTable中然后select,这两种方法,有没有更高效的办法? 

问题补充:

开发语言C#,求大神赐教,服务器配置不是太大的问题,都是联想E7的服务器,内存64+

MSky的主页 MSky | 菜鸟二级 | 园豆:436
提问于:2016-10-09 14:50
< >
分享
最佳答案
1

加索引应该会快一些。

用缓存比较好,上面兄弟提到的,去了解下memcache 像这种缓存机制是存储在内存中,每隔一天提取一次数据,缓存失效时间。

奖励园豆:5
维依 | 初学一级 |园豆:16 | 2016-10-10 13:24

刚看了点memcache的资料,感觉受点启发,回来可以研究下,索引那些肯定都建了,要没索引速度慢上天,使用情况比较特殊,条件非常多

写个sql例子吧,这只是其中的一步而已,其实还要join很多表,再把查询出的数据通过一个列group by,然后再统计count,中间还有几张表是Tree结构需要做递归

select mass from TableA where mass between 1000 and 1002 and mass between 1004 and 1005...

光这个between条件就有200-800个,从这一步需要过滤出来大概100-200万条数据,然后再对这200万条数据做N步处理,把mass列做上索引,这个过程下来,全部需要大概1分钟时间,通过线程池的话还不敢开的太多

MSky | 园豆:436 (菜鸟二级) | 2016-10-11 10:24
其他回答(3)
1

大概会查出多少数据?

顾晓北 | 园豆:10898 (专家六级) | 2016-10-09 14:52

实际业务要比那个语句复杂,用到多表连接以及递归查询以及通过group by 进行count计算等,最终只有10条数据,纯SQL效率不太高,我想把数据全部加载到内存中,然后通过逐步的过滤统计得到最后结果,这样会不会效率高一些

支持(0) 反对(0) MSky | 园豆:436 (菜鸟二级) | 2016-10-09 14:58

@MSky: 既然一个月都不太可能变动一次,那就查出来以后放缓存里呗。。。

支持(1) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2016-10-09 14:59

@顾晓北: 没有用过缓存,不太懂这个,之前搜了关于缓存,都是说添加SQL依赖缓存的,也没弄太明白,每次去数据库全表扫描,导致cpu全是满负载,有缓存方面的资料可以提供么

支持(0) 反对(0) MSky | 园豆:436 (菜鸟二级) | 2016-10-09 15:01

@MSky: 缓存跟缓存依赖两个东西,缓存依赖的作用就是该清除缓存的时候自动清除缓存。。。你这一个月都不太可能变动的数据,完全可以不用缓存依赖,每天跑一次数据,放到缓存里就可以。

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2016-10-09 15:04

@MSky: 想找缓存依赖的相关信息搜sqlcachedependency,这个只是sqlserver的,而且需要sqlserver的功能配合,还有文件缓存依赖,比如一个文件被修改了,缓存自动清除。。。

支持(0) 反对(0) 顾晓北 | 园豆:10898 (专家六级) | 2016-10-09 15:06
0

先优化吧.索引加够了再说.

吴瑞祥 | 园豆:29449 (高人七级) | 2016-10-09 15:33
0

才1千万数据,加个index,速度飞起

czd890 | 园豆:14488 (专家六级) | 2016-10-09 17:56

 要只是通过几个简单条件select ,一个亿数据也慢不到哪哎

支持(0) 反对(0) MSky | 园豆:436 (菜鸟二级) | 2016-10-11 10:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册