首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > IBM DB2 >

查询9万多张表中特定的某个内容,该如何处理

2013-02-24 
查询9万多张表中特定的某个内容有一数据库有9万多张表我想查询这表中的关键字段NAME为小王的所有记录这个S

查询9万多张表中特定的某个内容
有一数据库有9万多张表
我想查询这表中的关键字段NAME为小王的所有记录


这个SQL语句该如何写呢?
怎样才能降低查询的时候不影响整体运行速度呢?


[解决办法]
9万多张表, 如果用

select * from table1 where name= '小王'
union all
select * from table2 where name= '小王'
union all
select * from table3 where name= '小王'
union all
....
union all
select * from table10000 where name= '小王'

速度上应该还可以,不过你的这个SQL语句的长度估计无法承受。


建议还是用程序一个表一个表进行搜索比较合理。
[解决办法]
用程序,每个表都循环过去
[解决办法]
估计要用SP,取得所有表名,根据表名取得字段名,一个一个循环判断
[解决办法]
要从那么多表里去取数据,我想性能牺牲是免不了的。我觉得讨论怎么省事还可以。

我有一个思路,我没实验过,但我觉得是可行的。
先从SYSIBM.SYSTABLES中选出你要查询的表,然后一个一个循环,组合字符串,即叠加(SELECT NAME FROM 表明 UNION ALL ),最后用隐式查询然后返回结果集!

当然,也可以循环tables做单个select,呵呵。也是隐式的。。。
[解决办法]
只能每个表出select一次,循环处理。
[解决办法]
先把表明查出来(从SYSIBM.SYSTABLES,可以放入一个表中)
然后循环这些表明,找出相关的记录
[解决办法]
用程序并不复杂啊?

访问系统表,得到所有表名。然后循环处理每条记录(系统表中的每个记录也就是一个表)
然后对每个表名,在程序中生成相应的 select * from " + rs.fields("tableName") 根据返回的结果判断是否包含 小王

楼主现在的问题是什么呢? 不了解怎么写程序?还是其它?
[解决办法]
访问系统表,得到所有表名。然后循环处理每条记录(系统表中的每个记录也就是一个表)
然后对每个表名,在程序中生成相应的 select * from " + rs.fields("tableName") 根据返回的结果判断是否包含 小王

[解决办法]
能有这样的需求 就不要考虑性能问题了。
遍历表名,遍历出此表的所有列名, 查询
select * from table where col1 =' 小王'
拼接SQL 吧
[解决办法]
传说中的全文索引是如何索引的?

另外,感觉你这个需求有问题,一般不会有这么变态的需求吧,

看看变通一下吧,

如果程序也不会写,SQL语句也不会,那就没办法了,

[解决办法]
我是菜鸟。我说一下我的理解:
为什么非要一次执行呢。
你9万张表可以化大为小,执行时以10张表(或者更多张表)为单位查询,将每次返回结果存储到一个表中;
这样效率肯定会快;
[解决办法]
select * from table1 where name= '小王'
union all
select * from table2 where name= '小王'
union all
select * from table3 where name= '小王'
union all
....
union all
select * from table10000 where name= '小王'


[解决办法]
9万张表确实够疯狂的
解决方案一般可从两个方向入手:
一 通过前台程序语言入手
   一般在这种情况想要大幅度提高查询性能很难;但可以通用使用AJAX和多线程结合处理;
二 通过优化SQL语句和数据库结构
   表结构一般是动不了的,只能寄希望于索引;
   再者优化SQL

select * from table1 where name= '小王'
union all
select * from table2 where name= '小王'
union all
select * from table3 where name= '小王'


union all
....
union all
select * from table10000 where name= '小王'


这个运行起来看来时间短不了,如果在 NAME列上有索引还好,如是没有那岂不是对九万张表都要进行一次表扫描(太可怕了)
或者通过使用动态语句把查询的结果放到一张或多张表式,再显示结果(这种查询执行的频度,再视情况选择exec 还是 sp_executesql )
[解决办法]
感觉不是很变态啊.
主要就是表多的问题.如果每一个表都查一次可能的话,
那么浪费在获取连接的时间太多了.
所以还是分批次查询,
说的简单点就是union all 形式,
一次设定多少张表,比如说1千张.
也可以更多.主要看数据库性能了.

还有就是缓存sql的形式.
获取一次连接,然后执行.

第三种方法就很简单了.用视图就行了.
不过没试过9万多的.不过也可以实行分批的方法建立,建立9个或者其他的.
[解决办法]
引用:
引用:
引用:

9W多张表,里面肯定有其他类型的表,但又无法获知哪些表才有NAME字段,所以需要全部都查询一遍
都在一个实例用户下的


那你这个需求就有问题了,查询出所有的name字段,而且还不知道是哪个表的.这样有意义么?

你查出来都不知道这个name是什么作用.有意义么?

把……


你这数据库不会是卖空间的吧.查询的是所有用户的表,既不知道表名称,也不知道表结构.
现在让你在数据库中捞出关于"小王"的信息?
如果对数据库操作太大,会影响用户的使用.

假如说是这样的话,晚上2点以后到早上6点之间可以进行这个查询啊..
通过dba的权限用户进行查询系统表,查出表明和列明,然后进行查询表操作......

然后第二天可以查看结果,然后同时保存含有name字段的表名,和对应的列.

然后生成一个配置文件.就是这些表明和列和组织的sql.
下次查询就使用配置文件.进行查询.就不用这么麻烦了.直接查究行了.

还可以更新配置文件等....
[解决办法]
1.先从SYSIBM.SYSTABLES中选出你要查询的表
  List systabList=session.createQuery(SYSIBM.SYSTABLES)
2.根据查询的结果拼出SQL,然后把些SQL存在一张表中MY_QUERY
  可能数据库对union查询表的个数和整个长度的有限制,就像varchar的长度不能大于4000一样,
 String sql="insert into my_query_date(fld1,fld2,..fldn) ( ";
  int max_tab_num=n;
  for (Object obj :systabList)
  {
    sql+=" select fld1,fld2,..fldn from "+obj.obj +"where name='小王' +union";
    i++;
    if (i=max_tab_num)
       {
        sql+=")";
        session.connection().createStatement().execute("insert into my_query fld values("+sql+")" );
        i=0;
        sql="insert into my_query_date(fld1,fld2,..fldn) ( ";
        }
   
  }
  if  (!sql.equals("insert into my_query_date(fld1,fld2,..fldn) ( "))
  {
    sql+=")";
        session.connection().createStatement().execute("insert into my_query fld values("+sql+")" );
  }
3.根据拼好的SQL把数据拿出来, 数据就存在my_query_date中;
   List sqlList=session.createQuery(my_quert);
    for (Object obj :sqlList){
session.createSQLQuery(obj.fld).executeUpdate();
    }

4.大功告成,从my_query_date表中拿数据就行了..
  设计表结构时,灵活一下,中间注意事务..
[解决办法]
http://blog.csdn.net/tzysf/archive/2009/09/21/4574914.aspx

declare   @str   varchar(100)  
  set   @str='郑州南阳S-1N001'     --要搜索的字符串  
   
  declare   @s   varchar(8000)  
  declare   tb   cursor   local   for  


  select   s='if   exists(select   1   from   ['+b.name+']   where   ['+a.name+']   like   ''%'+@str+'%'')  
    print   ''所在的表及字段:   ['+b.name+'].['+a.name+']'''  
  from   syscolumns   a   join   sysobjects   b   on   a.id=b.id  
  where   b.xtype='U'   and   a.status>=0  
    and   a.xusertype   in(175,239,231,167)  
  open   tb  
  fetch   next   from   tb   into   @s  
  while   @@fetch_status=0  
  begin  
    exec(@s)  
    fetch   next   from   tb   into   @s  
  end  
  close   tb  
  deallocate   tb  


[解决办法]
中间会多拼一个union 注意处理一下..
这里只是提供一个大概的解决思路..
第三步
做之前应该先truncate talbe my_sql_date;
可以放在存储过程中,用定时调度实现
前两步的条件拼好的SQL还可以维护.
[解决办法]
引用:
http://blog.csdn.net/tzysf/archive/2009/09/21/4574914.aspx

SQL code

declare   @str   varchar(100)  
  set   @str='郑州南阳S-1N001'     --要搜索的字符串  
   
  declare   @s   varchar(8000)  
  declare ……

这里存存储过程吧,oracle应该也提供全库检索功能.查查资料.
[解决办法]
select * from table1 where name= '小王'
union all
select * from table2 where name= '小王'
union all
select * from table3 where name= '小王'
union all
....
union all
select * from table10000 where name= '小王'

热点排行