如何做 全数据库(很多表)查询?也就是全站查询

newdigitime 2009-12-04 08:04:02
网站中经常会提供 关键词查询检索功能

一般都是让用户输入查询字符串 ,然后选择需要查询的“类别”进行查询,这种查询简单一些。
譬如一个类别对应一个表,那么直接在这对应的表中的“标题”或“正文”字段查找这个关键词就行了。

但如果用户比较懒,或者说为了让用户有更好的体验。用户只需要输入某个关键词,不需选择分类,直接点“查询”
就行了。这就需要在全数据库的很多个表中(譬如几百个表)查找某个关键词。

这样如何处理呢?我能想到的处理方式:

1.在程序代码中通过循环语句循环各表,做几百次查询。
2.在程序代码中做一次联合查询(联合几百个表,疯了)
3.在存储过程中做几百次循环查询或一次数百表联合查询

上次哪种办法可取呢?如何优化?


...全文
419 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
newdigitime 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 guguda2008 的回复:]
预先建好针对全库的视图,做好视图的优化,无论加不加类别都在视图里找
[/Quote]

请问如何建全库视图?各表之间没有主外键关系,只是有相同的字段.
newdigitime 2010-01-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bqb 的回复:]
在数据库中查询含有某值的所有表所在的列

SQL codedeclare@strvarchar(100)set@str='admin'--要搜索的字符串declare@svarchar(8000)declare tbcursor localforselect'if exists(select 1 from ['+b.name+'] where ['+a.name+'] like''%'+@str+'%'')
print''所在的表及字段: ['+b.name+'].['+a.name+']'''from syscolumns ajoin sysobjects bon a.id=b.idwhere b.xtype='u'and a.status>=0and a.xusertypein(175,239,231,167)open tbfetchnextfrom tbinto@swhile@@fetch_status=0beginexec(@s)fetchnextfrom tbinto@sendclose tbdeallocate tb


[/Quote]

研究一下,好象很高深
newdigitime 2009-12-05
  • 打赏
  • 举报
回复
又研究了一下,与www.58.com类似的网站有www.ganji.com
都是分类信息网,有非常多的分类.大量的数据
这两个站都有全站检索功能,我试了一下,速度都很快,而且是将不同类别表中的数据混合输出到页面
如果是用多表循环检测,不应该有这么快啊.而且如何做到多个表的数据混合输出呢(按时间倒序)

个人感觉"全文索引"肯定是用上了,但如何使用这全文索引,这两个网站肯定有自己的独到方法的.
dawugui 2009-12-05
  • 打赏
  • 举报
回复
1.在程序代码中通过循环语句循环各表,做几百次查询。

除了这个办法,想不到好办法了.

不过,这个需求确实够牛.
guguda2008 2009-12-05
  • 打赏
  • 举报
回复
循环查表没试过,不知道效率怎么样
guguda2008 2009-12-05
  • 打赏
  • 举报
回复
预先建好针对全库的视图,做好视图的优化,无论加不加类别都在视图里找
bqb 2009-12-05
  • 打赏
  • 举报
回复
在数据库中查询含有某值的所有表所在的列

declare   @str   varchar(100)   
set @str='admin' --要搜索的字符串

declare @s varchar(8000)
declare tb cursor local for
select '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


ProgrammerNO1 2009-12-05
  • 打赏
  • 举报
回复
难~~~
newdigitime 2009-12-04
  • 打赏
  • 举报
回复
琢磨了半天,我感觉这个问题的核心是"一次要查询几百个表"的问题.

如果将数据库中一部分表(譬如同一大类下的表)建立联合视图 ,从几百个表融合成几十个?然后针对每个视图建全文索引.

这样还需要循环搜索,但循环次数显然少多了.

不知这个思路是否可行
newdigitime 2009-12-04
  • 打赏
  • 举报
回复
找到一个以前的贴子,也是问这个问题的.
好象都没有太好的办法.
主要是提到"全文检索",还有一"同志"提到尽量减少表的数量.

http://topic.csdn.net/t/20050601/09/4050520.html
newdigitime 2009-12-04
  • 打赏
  • 举报
回复
全文索引也应该是针对单独一个表建立的吧

你看这个58网站,有几百个类别信息.不应该是用几个表来存储的.

--小F-- 2009-12-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 newdigitime 的回复:]
我今天在www.58.com上准备找一个二手货时,突然就想到这个问题

难道58的全站搜索是用的N个表循环查询?
[/Quote]

估计是全文搜索
newdigitime 2009-12-04
  • 打赏
  • 举报
回复
我今天在www.58.com上准备找一个二手货时,突然就想到这个问题

难道58的全站搜索是用的N个表循环查询?
newdigitime 2009-12-04
  • 打赏
  • 举报
回复
谢谢楼上
--小F-- 2009-12-04
  • 打赏
  • 举报
回复
第一种吧 第2种是绝对的不可取

而第三种存储过程中做几百次循环查询估计也疯了

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧