刚下载了某个通讯软件群的数据库 有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上建立索引