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

千万数量级的数据库,全文索引很慢,如何进行优化?
在SQL SERVER 2008,有一个表,里面有大概1000W的数据,对该表建立全文目录,分别执行下面两个语句,每个语句都连续执行10次,并统计执行时间。

语句1,返回1条记录:
select * from 数据表 where contains(*,'北京创新乐知信息技术有限公司')
连续执行十次需时6秒左右

语句2,返回3条记录:
select * from 数据表 where contains(*,'北京 and 创新乐知')
连续执行十次需时0.8秒左右

按道理,语句1只有一个条件,并且只返回一条记录,执行应该比语句2要快才对,但是结果却是语句2更快,而且快了好多倍。真是百思不得其解,望各位高手指点一二!

------解决方案--------------------
刚看了下全文索引,没用过,但是帮顶:
http://blog.csdn.net/coleling/article/details/6258415

------解决方案--------------------
打开查询分析器按Ctrl+L执行下面句看看有什么区别
select * from 数据表 where contains(*,'北京创新乐知信息技术有限公司')
select * from 数据表 where contains(*,'北京 and 创新乐知')

------解决方案--------------------
目测是数据分布和唯一性所导致了不同的内容查询速度不一样。sqlserver内置的全文索引好像一直都不是很理想,听说可以用中间层或者第三方工具来实现,不过具体我没用过。
------解决方案--------------------
这是sql server的算法决定的,1000万条数据,我之前做报表的时候查询也遇到和你一样的情况,查同一个表,查出来几十条和查出来几千条,几千条的比几十条的还快。
------解决方案--------------------
数据千万级别之多,占用的存储空间也比较大,可想而知它不会存储在一块连续的物理空间上,而是链式存储在多个碎片的物理空间上。可能对于长字符串的比较,就用更多的时间查找与比较,这就导致用更多的时间。
当然,你在做查询时,有可能其他服务也正在查询,包括sqlserver运行时的服务,它们都占用了很多的内存,这也是变慢的可能原因之一。

建议你重建索引,尝试一下。

------解决方案--------------------
SQL SERVER自己的分词器问题,你的长搜索语句被分成了太多词,每个词检索一遍索引走IO,所以效率下降。

如果数据量太大,确实建议使用第三方软件,lucene或者hubble什么的,SQL SERVER自带的全文索引玩玩还可以,真用真心不可靠。
------解决方案--------------------
千万级数据,学习一下。
------解决方案--------------------
全文索引没用过