| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1148 人关注过本帖
标题:[求助]如何在海量库里使用索引查找记录?
只看楼主 加入收藏
peter37
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-7
收藏
 问题点数:0 回复次数:6 
[求助]如何在海量库里使用索引查找记录?
本人在研究搜索引擎的时候遇到一个问题,希望高手指教。
Tbl_Doc表中有4个字段:DocID,Url,Title,IncomeTime。DocID是标识字段,已建立簇聚索引。Tbl_Doc表中有1亿多条记录,我想从指定DocID中查询记录,并按Incometime排序。

Dim SQL,DocList as string
DocList="'34','32','3','656',''764','54','1255344','2545','7454','256','65343','21343','21676','93432','43434'" 通常情况下DocList很长
SQL="Select Title,Url from Tbl_Doc where DocID In (" & DocList & ") order by Incometime"
使用以上SQL查询,发现查询速度很慢,原因是扫描整个表,没有使用索引。

如果用
union,即select * from tbl_doc where DocID=34 union select * from tbl_doc where DocID=32 union select * from tbl_doc where DocID=3 union select ..... union select .....,这样的话速度恐怕也不快。有什么方法能解决这个问题呢?请高人赐教,谢谢!
搜索更多相关主题的帖子: 库里 索引 海量 记录 
2006-04-07 22:54
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
额。。。
这个。。。
感觉上跟表的设计有关系。
我也碰到过这样的表,具体原因不清楚,2个主键,第一主键可以索引,第二主键只会扫描全表。
还有个表用subquery调数据的时候也是全表scan,只能人工把需要的数据填入IN后面的括号里。

这样简单的查询语句应该是没有太大的改进余地了,Excution Plan你看过没有?

再有就是你的检索过程是由本地机器执行还是提交服务器查询后取得结果置本地机器?

可以探讨探讨

[此贴子已经被作者于2006-4-8 2:10:02编辑过]


2006-04-08 01:48
peter37
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-7
收藏
得分:0 

谢谢版主及时回复!
检索是由网页提交服务器的。表的设计很简单,请问“跟表的设计有关系”是什么意思。频繁查询的DocID已建索引了,我想设不设主键影响不大。怎样操作Excution Plan?有什么作用?
其实我的问题是搜索引擎开发的最后一步工作了,即已知包含关键字的DocID,从Tbl_Doc表中select记录,返回搜索结果给浏览者。如果不考虑排序的话,我想可以每次用50个select... union select...,即每页显示50条记录,但这样的做法对搜索引擎来说很不现实。如果一次union所有到临时表里,排序后再输出结果,如果有1万个select....union的话,情况也不堪设想。头痛ing!

2006-04-08 11:11
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 
的确我昨天晚上试过一下,只有clustered index也可以达到index检索的效果,不必使用主键。

表的设计问题说不好,我反正见个一个表几千万条的数据,只有4个字段,2个字段组成联合主键,第一主键是Int,第二主键是varchar,用第二主键做IN条件的检索时,居然给我来全表扫描,3行数据抽了20分钟才出来。

Excution Plan的话你在查询分析器里可以看到,在那个Object Browser的旁边,快捷方式是Ctrl+L

你在查询窗口内把你的查询语句粘贴进去,然后按一下那个就可以看到查询各个步骤花费时间的百分比以及查询方案(比如是用索引还是全表扫描)。

你这样海量的数据库我还没碰到过。。。10几亿。。。

2006-04-08 11:22
peter37
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-7
收藏
得分:0 
[讨论]谢谢!

每页显示多少行,就union 多少select,这样做的缺点是不能排序,好处是速度飞快(刚试过)。解决排序的问题,我想不一定非得在select的概念里动脑筋吧。比如预先把库order by 好,生成文本文件。(SQL Server的全文索引就是把关键字预先生成文本索引文件的,现在的搜索引擎也都这么干。)另外,知不知道select .....union select.....中加个order by 怎么写,SQL Server是怎么干活的?笨方法,但毕竟是个方法了!

2006-04-09 17:27
peter37
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-4-7
收藏
得分:0 
in 等于 or
select * from product where id in ('10','15'),查询优化器会转化成select * from product where (id =10 or id=15),就是说,一旦使用in 或or,全表扫描就干活了。再问个问题,标识列本身应该按照物体顺序排的吧,还要建立索引吗?
2006-04-09 17:35
LouisXIV
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:789
专家分:0
注 册:2006-1-5
收藏
得分:0 

不建立索引在EP里看时是用全表扫描的。


2006-04-12 12:58
快速回复:[求助]如何在海量库里使用索引查找记录?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025926 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved