SQL2000 全文索引完全图解

全文检索可以对varchar,text,image型字段进行检索,但一个表最多只能建一个全文索引
SQL Server 2000 引入了对存储在 image 列中的这些类型的数据执行全文检索的能力。
如果没有全文索引,对字符的模糊查询只能对基表进行全表扫描(或索引扫描),
执行模糊查询都需要对全表扫描或索引扫描意味着消耗大量IO。
如果模糊查询经常发生,会造成数据库性能恶化。
本篇为简单起见,仅在varchar型字段上图文演示非常完整的而且是高效可行的全文索引
创建及维护过程.
1:
在企业管理器中展开要建立全文索引的数据库,右击“全文目录”,选择“新建全文目录”
如 图1 所示。
可以修改全文目录的路径,通过将全文目录放在单独的磁盘或磁盘阵列可以提高效率。
建议不要对整个全文目录进行任何形式的填充调度。

=================== 图1 ===================
2:
接下来对具体的表添加全文索引。
全文索引不能建立在视图上,只能建立在有唯一索引(主键也是唯一索引)的基础表上。
下图2 演示如何对表建立全文索引。
演示中的 t_fulltext 表的建表及初始化数据的脚本如下:
create table t_fulltext
(
rid int identity(1,1),
title varchar(256) not null,
writetime datetime default(getdate())
)
go
alter table t_fulltext add constraint pk_fulltext primary key ( rid )
go
--初始化数据
insert into t_fulltext(title) values('山东蓬莱河西金矿透水事故2人死亡3人失踪(21:29)')
insert into t_fulltext(title) values('泰国将在广西南宁设立总领事馆(21:10)')
insert into t_fulltext(title) values('河北安徽等12省减免农业税等政策落实到位(20:43)')
insert into t_fulltext(title) values('台湾学者托梦预测陈水扁元旦讲话(20:04)')
insert into t_fulltext(title) values('澳门特首何厚铧发表元旦献辞向市民问候新年(20:02)')
insert into t_fulltext(title) values('南水北调首个建成项目山东段济平干渠通水成功(19:48)')
insert into t_fulltext(title) values('组图:北京110摩托车巡警亮相(18:07)')
insert into t_fulltext(title) values('福建广西发生患者死亡事件 医院责任人被处理(17:33)')
insert into t_fulltext(title) values('北京大容量公交车运营首日遭遇乘客爆满(17:30)')
insert into t_fulltext(title) values('北京公安系统今天全部停休严查五环内放炮(17:30)')
insert into t_fulltext(title) values('研究发现海龙基因酶对禽流感病毒有杀伤作用(17:27)')
insert into t_fulltext(title) values('上海世博会筹办进入实质性操作面临五大挑战(17:03)')
insert into t_fulltext(title) values('台媒体称陈水扁元旦祝词必将老调重弹(15:30)')
insert into t_fulltext(title) values('珠三角咸潮影响范围小于去年(15:12)')
insert into t_fulltext(title) values('上海市民体验轨道交通4号线列车(组图)(14:53)')
insert into t_fulltext(title) values('广州亿元集资诈骗案主犯王日升被判死缓(图)(14:44)')
insert into t_fulltext(title) values(' 评论:取消农业税让民众共享经济增长成果(17:30)')
insert into t_fulltext(title) values('香港媒体谈美国应对中国新策略:合作与防范(15:57)')
insert into t_fulltext(title) values('专访中国地震局局长陈建民:地震是能够预测的(15:56)')
insert into t_fulltext(title) values('评论:野蛮公交莫成城市丑陋形象代言人(13:27)')
insert into t_fulltext(title) values('台媒体称当局与民间企业对立非民众之福(12:50)')

=================== 图2 ===================
3:出现的欢迎界面如 图3

=================== 图3 ===================
4:为全文索引选择唯一索引,如 图4

=================== 图4 ===================
5:选择全文索引的列,注意一张表只能建一个全文索引。建
议不要选择断词的语言,这样实际会使用默认的断词语言。如图5 所示。
通过运行
sp_configure 'default full-text language'
可以查看默认的断词语言,如我的机器上运行上条语句,config_value 值是 2052
它表示简体中文。
其它代码所表示的语言可以查阅Book Online的“default full-text language”关键词。
由于SQL Server对中文断词并不是很高明,因此并不能依靠SQL Server带给您非常智能的搜索,这意味着您的全文搜索结果,可能有不希望出现的记录,或您希望出现的记录没有出现。

=================== 图5 ===================
6:将表指派到全文目录,如 图6 所示,也可以通过此界面创建新目录。

=================== 图6 ===================
7:接下来会提示对表进行填充调度,为能够准实时地把基表的全文索引列的修改(增、删、改)准实时地应用到全文索引,建议使用下面介绍的其它方法进行索引维护。如 图7 所示,建议不要在这里添加任何调度,直接点击“下一步”。
如果数据不会再修改,则在一次完全填充以后,不用再增加其它类型的表级填充。
如果实施到本步骤,不再添加任何形式的表调度,那么基表数据的更新,将不能更新到全文索引。

=================== 图7 ===================
8:如 图8 所示出现的完成界面提示中点击“完成 ”,请稍微等待直到出现下一界面。

=================== 图8 ===================
9:在如 图9 所示的界面中点击“确定”。
由于尚未在表上添加任何调度,因此还需要继续设置。

=================== 图9 ===================
10:在企业管理器中右击 f_fulltext 表,如 图10 所示,选中“更改跟踪”。
选中更改跟踪后,以后对基表数据的修改,才能反映到全文索引中。
特别注意:一旦选中“更改跟踪”,根据经验,其实是必须对该表进行完全填充的。
如果是在线使用的全文索引数据库,选中“更改跟踪”会导致性能迅速下降,导致全文索引
无法使用。

=================== 图10 ===================
11: 在企业管理器中右击 f_fulltext 表,如 图11 所示,选中“更新后台中的索引”。
到本步,全文索引就完全完成了。由于我们选中了“更改跟踪”,此时实际已经开始了表的完全填充。
根据经验,300万条全文索引字段长为 50 的表,需要8到10小时才能完成完全填充。

=================== 图11 ===================
12:可以通过双击全文目录下的全文索引,查看该全文目录的属性,如 图12 所示,状态为“空闲”,而项目计数大于0,则表示完全填充已经完成了。

=================== 图12 ===================
13:如何进行全文索引查询(仅简单介绍)
全文索引查询建议使用 CONTAINS 及 FREETEXT 谓词进行查询。
如果关键词仅包括干扰词(有关干扰词的信息,请参阅Book Online的“干扰词”关键字)
select * from t_fulltext where contains(title,'3')
则会报如下错误
服务器: 消息 7619,级别 16,状态 1,行 1
全文操作运行失败。查询子句只包含被忽略的词。
使用下面的语法,能避免出现错误,且能够确实查询出正确的记录。
select * from t_fulltext where contains(title,'"*3*"')
13 台媒体称陈水扁元旦祝词必将老调重弹(15:30) 2005-12-31 23:17:17.670
10 北京公安系统今天全部停休严查五环内放炮(17:30) 2005-12-31 23:17:17.653
17 评论:取消农业税让民众共享经济增长成果(17:30) 2005-12-31 23:17:17.670
9 北京大容量公交车运营首日遭遇乘客爆满(17:30) 2005-12-31 23:17:17.653
8 福建广西发生患者死亡事件 医院责任人被处理(17:33) 2005-12-31 23:17:17.653
(所影响的行数为 5 行)
全文索引的简单介绍就到这里了,希望能起个抛砖引玉的作用。

(0)

相关推荐

  • 理解Sql Server中的聚集索引

    说到聚集索引,我想每个码农都明白,但是也有很多像我这样的猥程序员,只能用死记硬背来解决这个问题,什么表中只能建一个聚集索引,然后又扯到了目录查找来帮助读者记忆....问题就在这里,我们不是学文科,,,不需要去死记硬背,,,我们需要的就是能看到在眼里面的真实东西.....我们都喜欢聚集索引,因为它能够把无序的堆表记录变成有序,还玩起了B树...这样就把复杂度从N降低到了LogMN... 这样的话逻辑读,物理读就下来了.  一:现象 1:无索引的情况 还是老规矩,看个例子感受下,首先我有一个Prod

  • SQL2005CLR函数扩展 - 关于山寨索引

    本文只是一个山寨试验品,思路仅供参考. --------------------------------------------------------------------------------原理介绍:索引建立 目录结构划分方案也只是很简易的实现了一下,通过unicode把任意连续的两个字符(中文或英文)分为4个字节来做四层目录,把索引的内容对应的主关键字(主要为了使用sql索引和唯一性)作为文件名,两个字符在索引内容中的位置作为文件后缀来存储.文件本身为0字节,不保存任何信息. 比如一

  • Sql Server中的非聚集索引详细介

    非聚集索引,这个是大家都非常熟悉的一个东西,有时候我们由于业务原因,sql写的非常复杂,需要join很多张表,然后就泪流满面了...这时候就有DBA或者资深的开发给你看这个猥琐的sql,通过执行计划一分析...或许就看出了不该有的表扫描...万恶之源...然后给你在关键的字段加上非聚集索引后...才发现提速比阿斯顿马丁还要快...那么一个问题来了,为什么非聚集索引能提速这么快...怎么做到的???是不是非常的好奇??? 这篇我们来解开神秘面纱.  一:现象 先让我们一睹非聚集索引的真容,看看到底

  • MSSQL自动重建出现碎片的索引的方法分享

    1.索引碎片的产生? 由于在表里大量的插入.修改.删除操作而使索引页分裂.如果索引有了高的碎片,有两种情况,一种情况是扫描索引需要花费很多的时间,另一种情况是在查询的时候索引根本不使用索引,都会导致性能降低. 2.碎片类型分为: 2.1 内部破碎 由于索引页里的数据插入或修改操作而发生,以数据作为稀疏矩阵的形式的分布而结束,这将导致数据页的增加,从而增加查询时间. 2.2外部破碎 由于索引/数据页的数据插入或修改而发生,以页码分离和在文件系统里不连贯的新的索引页的分配而结束,数据库服务器不能利用

  • 关于重新组织和重新生成索引sp_RefreshIndex的介绍

    开始: -------------------------------------------------------------------------------- 在上周,客户反映一个系统问题,当处理大量数据的时候,出现网络超时.后来,我们跟踪测试,发现是由于索引碎片多而引起的网络超时. 解决方法,自然是重新组织和重新生成索引.在这里,我写了一个存储过程sp_RefreshIndex来实现. 存储过程sp_RefreshIndex: 复制代码 代码如下: use mastergoif ob

  • mssql 建立索引第1/2页

    表的索引与附在一本书后面的索引非常相似.它可以极大地提高查询的速度.对一个较大的表来说,通过加索引,一个通常要花费几个小时来完成的查询只要几分钟就可以完成.因此没有理由对需要频繁查询的表增加索引. 注意: 当你的内存容量或硬盘空间不足时,也许你不想给一个表增加索引.对于包含索引的数据库,SQL Sever需要一个可观的额外空间.例如,要建立一个聚簇索引,需要大约1.2倍于数据大小的空间.要看一看一个表的索引在数据库中所占的空间大小,你可以使用系统存储过程sp_spaceused,对象名指定为被索

  • MSSQL 大量数据时,建立索引或添加字段后保存更改提示超时的解决方法

    一般我们都喜欢用数据库管理器的UI来对数据表结构进行更改,然后自然而然地点"保存" 按钮进行保存,但数据量比较大的时候,用这招往往会出现"无法创建索引"IX_索引名". 超时时间已到.在操作完成之前超时时间已过或服务器未响应. "这种错误.一时不知所措,蜡人张的文章 复制代码 代码如下: 修改表属性后使用"索引/键"对话框为一个大型表(记录数13,239,473)创建索引,提示: - 无法创建索引"IX_TableN

  • 详解sqlserver查询表索引

    SELECT   索引名称=a.name ,表名=c.name ,索引字段名=d.name ,索引字段位置=d.colid FROM sysindexes a JOIN sysindexkeys b ON a.id=b.id AND a.indid=b.indid JOIN sysobjects c ON b.id=c.id JOIN syscolumns d ON b.id=d.id AND b.colid=d.colid WHERE a.indid NOT IN(0,255) -- and

  • SQL2005重新生成索引的的存储过程 sp_rebuild_index 原创

    公司运营着的网站,流量很大,网站是交互式的,经常在过了三四个月的时候索引生成的碎片就很多,由于很大一部分页面没有生成静态,这就导致网站在打开的速度上会变慢. 以前都是手工右击索引重新生成,但是索引太多,操作起来费时费力,索引在网上找了个存储过程,自己整理了一下,执行的时候只需要选择相应的数据库,运行exec sp_rebuild_index即可,如下. USE [master] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE

  • 在SQL SERVER中导致索引查找变成索引扫描的问题分析

    SQL Server 中什么情况会导致其执行计划从索引查找(Index Seek)变成索引扫描(Index Scan)呢? 下面从几个方面结合上下文具体场景做了下测试.总结.归纳. 1:隐式转换会导致执行计划从索引查找(Index Seek)变为索引扫描(Index Scan) Implicit Conversion will cause index scan instead of index seek. While implicit conversions occur in SQL Serve

随机推荐