日期:2014-05-17  浏览次数:20410 次

关于150E的数据的查方式....
本帖最后由 diaodiaop 于 2013-11-26 17:51:53 编辑
刚下载了某个通讯软件群的数据库 有10个 假设他们分别为

“QQGroupDB01”.......“QQGroupDB10”

每个数据库中 有1000个表 分别是

“table0001”........."table10000"

也就是 1W个表  其中他们的结构都一样 假设是


create table table0001
(
id int identity(1,1) primary key,
name varcahr(10),
sex int,
qunnum int,--重要查询条件。
)


现在我要查询qunnum=55441122

首先我不知道在哪个数据库中,也不知道在哪个表中。。

所以 我游标遍历所有的数据库,所有的表,组成一个长达19米的字符串作为

create view db_all
as
select id,name,sex,qunnum from QQGroupDB01.dbo.table0001 union all
select id,name,sex,qunnum from QQGroupDB01.dbo.table0002 union all
... ... ...
select id,name,sex,qunnum from QQGroupDB10.dbo.table1000

后面的东西。

这样 我查询db_all就能找到我想到的了。。

比如


select id,name from db_all where qunnum=445566


 可是实际上。当我操作的时候发现我错了。

根本查询不出来。很慢很慢还是查询不出来。我一看表。每个表的数据 在150W上下

那么一个数据库大概就是15E

所以我这个view的数据 应该在150E左右..

我这只是猜的 因为我


select count(1) from db_all


根本查询不出来。。

有什么解决方案...

------解决方案--------------------
加索引后,再加上点判断吧


然后做个循环

declare @i int, @tableName varchar(10)
while(@i<445566)
{
  select @i=max(qqnum) from table00000
  
  set @tableName =@tableName +1
}



------解决方案--------------------
可能用程序控制起来更好些
------解决方案--------------------
就是查询每个表的最大值,小于你查询的值的话,再去找下一个表
依次循环
当不小于你的查询值的时候,那你要查询的数据就在那个表中了

建立索引后,取一个表的最大值跟查询的值对比,然后判断要找的数据是否在这边表中,
效率远远高于你全部查一遍(即便是用到了索引)
------解决方案--------------------
写个存储过程,一个一个查。

没个单独的表上做好索引即可。 


------解决方案--------------------
引用:
写个存储过程,一个一个查。

没个单独的表上做好索引即可。 


另外,你可以输出是那个库的那个表有这个数据。

------解决方案--------------------
先把数据 合并到一个表中。


1. 群表 应该只有 8千多万。
在 QunNum 建立索引。

2. 群与QQ关系数据 有 14多 E.

 在QQNum, QunNum上建立索引