全文索引 Text index

定义:全文索引就是通过将文字按照某种语言进行词汇拆分,重新将数据组合存储,来达到快速检索的目的场合:当字段里存储的都是文本时适合用全文索引,常用于搜索文字优点:全文索引不是按照键值存储的,而是按照分词重组数据,常用于模糊查询Where name like '%leonarding%'效率比全表扫描高很多,适用OLAP系统,OLTP系统里面用到的并不多。缺点:全文索引会占用大量空间有时比原表本身占的空间还多,bug较多,维护困难。实验:全文索引性能优势创建一个表包含2个字段LS@LEO> create table leo_text_t1 (id int,name varchar(10));Table created.在name字段上创建B-tree索引,但检索的时候并没有用,还是全表扫描LS@LEO> create index leo_text_t1_bt_index on leo_text_t1(name);Index created.插入4条记录insert into leo_text_t1 values(1,'Tom');insert into leo_text_t1 values(2,'Tom Tom');insert into leo_text_t1 values(1,'Tom');insert into leo_text_t1 values(2,'Tom Tom');commit;LS@LEO> select * from leo_text_t1;        ID NAME---------- ----------         1 Tom         2 Tom Tom         1 Tom         2 Tom Tom我们在创建一个表,并在name字段上创建全文索引create table leo_text_t2 as select * from leo_text_t1;创建全文索引的前提ORACLE10g 创建全文索引过程:1,首先查看ORACLE是否已安装“全文检索工具”  通过查看是否存在 CTXSYS 用户,CTXAPP角色即可判断。LS@LEO> select username from dba_users;USERNAME------------------------------LSCTXSYS   默认是没有的,需要安装2个脚本catctx.sql,drdefus.sql2,如果ORACLE没有安装“全文检索工具”,则使用以下步骤手工安装。  a)进入ORACLE安装目录  cd $ORACLE_HOME  b)使用 DBA 角色登陆数据库  sqlplus sys/sys as sysdba  c)查看表空间文件存放路径  select name from v$datafile;  d)为 CTXSYS 用户创建表空间  CREATE TABLESPACE ctxsys  LOGGING  DATAFILE '/u01/app/oracle/oradata/LEO/file1/ctxsys01.dbf'  SIZE 32m  AUTOEXTEND ON  NEXT 32m MAXSIZE 2048m  EXTENT MANAGEMENT LOCAL ;  e)创建 CTXSYS 用户,创建 CTXAPP 角色  @?/ctx/admin/catctx.sql ctxsys ctxsys temp1 nolock  --(密码、表空间、临时表空间、用户状态)  --如果当前sql脚本无执行权限,请手工添加。  f)为 CTXSYS 执行初始化工作,如果没有此操作,后续操作会失败。  connect ctxsys/ctxsys;  @?/ctx/admin/defaults/drdefus.sql3,创建全文索引  a)创建词法分析器及相关表  --词法分析器execute ctx_ddl.create_preference('offerProdAddrLexer','CHINESE_LEXER');  --词法execute ctx_ddl.create_preference('offerProdAddrList', 'BASIC_WORDLIST');execute  ctx_ddl.set_attribute('offerProdAddrList','PREFIX_INDEX','TRUE');execute  ctx_ddl.set_attribute('offerProdAddrList','PREFIX_MIN_LENGTH',1);execute  ctx_ddl.set_attribute('offerProdAddrList','PREFIX_MAX_LENGTH', 5);execute  ctx_ddl.set_attribute('offerProdAddrList','SUBSTRING_INDEX', 'YES');b)创建全文索引LS@LEO> conn ctxsys/ctxsysConnected.CTXSYS@LEO> create index ls.leo_text_t2_text_index on ls.leo_text_t2(name) indextype is ctxsys.context;CTXSYS@LEO> conn ls/lsConnected.LS@LEO> set autotrace on;LS@LEO> select * from leo_text_t1 where name like '%Tom%';        ID NAME---------- ----------         1 Tom         2 Tom Tom         1 Tom         2 Tom TomExecution Plan   执行计划----------------------------------------------------------Plan hash value: 3687902158---------------------------------------------------------------------------------| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |---------------------------------------------------------------------------------|   0 | SELECT STATEMENT  |             |     4 |    80 |     3   (0)| 00:00:01 ||*  1 |  TABLE ACCESS FULL| LEO_TEXT_T1 |     4 |    80 |     3   (0)| 00:00:01 |---------------------------------------------------------------------------------全表扫描,cpu使用率3%Predicate Information (identified by operation id):---------------------------------------------------   1 - filter("NAME" LIKE '%Tom%')Note-----   - dynamic sampling used for this statement动态采样Statistics   统计信息----------------------------------------------------------         56  recursive calls          0  db block gets         23  consistent gets  全表扫描没有使用B-tree索引,导致23次一致性读          0  physical reads          0  redo size        538  bytes sent via SQL*Net to client        381  bytes received via SQL*Net from client          2  SQL*Net roundtrips to/from client          2  sorts (memory)          0  sorts (disk)          4  rows processedLS@LEO> select * from leo_text_t2 where contains(name,'Tom')>0;        ID NAME---------- ----------         1 Tom         2 Tom Tom         1 Tom         2 Tom TomExecution Plan   执行计划----------------------------------------------------------Plan hash value: 2789465217------------------------------------------------------------------------------------------------------| Id  | Operation                   | Name                   | Rows  | Bytes | Cost (%CPU)| Time     |------------------------------------------------------------------------------------------------------|   0 | SELECT STATEMENT            |                        |     1 |    32 |     4   (0)| 00:00:01 ||   1 |  TABLE ACCESS BY INDEX ROWID| LEO_TEXT_T2            |     1 |    32 |     4   (0)| 00:00:01 ||*  2 |   DOMAIN INDEX              | LEO_TEXT_T2_TEXT_INDEX |       |       |     4   (0)| 00:00:01 |------------------------------------------------------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------   2 - access("CTXSYS"."CONTAINS"("NAME",'Tom')>0)Note-----   - dynamic sampling used for this statement动态采样Statistics   统计信息----------------------------------------------------------         11  recursive calls          0  db block gets         19  consistent gets             0  physical reads          0  redo size        545  bytes sent via SQL*Net to client        381  bytes received via SQL*Net from client          2  SQL*Net roundtrips to/from client          0  sorts (memory)          0  sorts (disk)          4  rows processed小结:从如上实验来看,当我们检索大量文字的时候使用全文索引要比全表扫描快很多了,有弊就有利,由于全文索引会占用大量空间提前预估全文索引大小保留出足够的空间,context类型全文索引不是基于事务的,无法保证索引和数据实时同步,DML完成后,如果在全文索引中查不到键值时,可以通过手工or定时任务来刷新同步,而B-tree、位图都是实时的。总结:本次实验了B-tree  位图  全文三大索引的性能,同时比较了各自适合场合和用途,还总结了各自的优缺点

你可能感兴趣的:(insert,记录,values,空间,created)