zoukankan      html  css  js  c++  java
  • SqlServer 全文索引指令大全(转载)

    --    创建测试表
    --    DROP TABLE FullTextIndexing
    CREATE TABLE FullTextIndexing
    (
        ID INT IDENTITY(1,1) NOT NULL,
        Sentence VARCHAR(MAX)
    )
    
    --    创建聚集索引
    ALTER TABLE FullTextIndexing ADD CONSTRAINT PK_FullTextIndexing PRIMARY KEY CLUSTERED(ID ASC)
    GO
    
    --    将"全文搜索概述"页面的文字全部拷贝到txt,然后倒入到表FullTextIndexing中
    --    https://msdn.microsoft.com/zh-cn/library/ms142547(v=sql.105).aspx
    
    
    --    重复15次,从47行变为154万行
    INSERT INTO FullTextIndexing(Sentence)
    SELECT Sentence FROM FullTextIndexing
    GO 15
    
    
    SELECT COUNT(*) FROM FullTextIndexing
     
    --    【注】删除的语句不要执行!
     
    --    创建全文目录
    --    https://msdn.microsoft.com/zh-cn/LIBRARY/ms189520(v=sql.105).aspx
    CREATE FULLTEXT CATALOG [Catalog_Test]
    WITH
        ACCENT_SENSITIVITY = ON    --区分重音
        AS DEFAULT                --默认目录
        AUTHORIZATION [dbo];--全文目录的所有者
    GO
    
    
    --    更改全文目录的属性
    --    https://msdn.microsoft.com/zh-cn/LIBRARY/ms176095(v=sql.105).aspx
    ALTER FULLTEXT CATALOG [Catalog_Test] 
    REBUILD WITH ACCENT_SENSITIVITY = ON;    --重新生成整个目录并区分重音
    --REORGANIZE;    --重新组织全文目录
    --AS DEFAULT;    --指定此目录为默认目录
    GO
    
    --    从数据库中删除全文目录(先删除全文索引)
    --    https://msdn.microsoft.com/zh-cn/LIBRARY/ms188403(v=sql.105).aspx
    DROP FULLTEXT CATALOG [Catalog_Test];
    GO
    
    
    --    创建干扰字表
    --    https://msdn.microsoft.com/zh-cn/library/cc280405(v=sql.105).aspx
    CREATE FULLTEXT STOPLIST [Stoplist_Test] 
    FROM SYSTEM STOPLIST 
    AUTHORIZATION [dbo];
    GO  
    
    --    添加删除干扰字
    --    https://msdn.microsoft.com/zh-cn/library/cc280871(v=sql.105).aspx
    ALTER FULLTEXT STOPLIST [Stoplist_Test]
    ADD N'' LANGUAGE 2052;
    GO 
    
    ALTER FULLTEXT STOPLIST [Stoplist_Test]
    DROP N'' language 2052;   
    --ALL LANGUAGE 'English' 
    --ALL
    GO 
    
    --    从数据库中删除全文本非索引字表
    --    https://msdn.microsoft.com/zh-cn/library/cc280482(v=sql.105).aspx
    DROP FULLTEXT STOPLIST [Stoplist_Test];
    GO 
    
    
    --    创建全文索引
    --    https://msdn.microsoft.com/zh-cn/library/ms187317(v=sql.105).aspx
    CREATE FULLTEXT INDEX ON [dbo].[FullTextIndexing]
    (Sentence LANGUAGE 2052)        --索引列,明确列中存储的语言,方便过滤,如果有多个索引列,用逗号分隔,例如:(Sentence1 LANGUAGE 2052, Sentence2 LANGUAGE 2052, Sentence3 LANGUAGE 2051) 
    KEY INDEX PK_FullTextIndexing    --全文键:当前表中唯一索引名称
    ON [Catalog_Test]                --指定全文目录
    WITH (
        STOPLIST [Stoplist_Test],    --指定全文非索引字表
        CHANGE_TRACKING AUTO        --自动填充
        );
    GO
    
    --    更改全文索引的属性
    --    https://msdn.microsoft.com/zh-cn/library/ms188359(v=sql.105).aspx
    --    激活全文索引
    ALTER FULLTEXT INDEX ON [dbo].[FullTextIndexing] ENABLE;
    GO
    
    --    删除全文索引
    --    https://msdn.microsoft.com/zh-cn/library/ms184393(v=sql.105).aspx
    DROP FULLTEXT INDEX ON [dbo].[FullTextIndexing];
    GO
    --    测试常规查询方法(先查询全部数据,放到内存:154万行31秒)
    SELECT * FROM FullTextIndexing
    
    SET STATISTICS IO ON
    SET STATISTICS TIME ON
    
    SELECT * FROM FullTextIndexing WHERE Sentence LIKE '%全文索引%'
    /*执行了几遍,耗时13440 毫秒
    
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    
    (229376 行受影响)
    表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    
     SQL Server 执行时间:
       CPU 时间 = 11591 毫秒,占用时间 = 13440 毫秒。
    */
    
    SELECT * FROM FullTextIndexing WHERE CHARINDEX('全文索引',Sentence)<>0
    /*执行了几遍,耗时15338 毫秒
    
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    
    (229376 行受影响)
    表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    
     SQL Server 执行时间:
       CPU 时间 = 12714 毫秒,占用时间 = 15338 毫秒。
    */

     
    --    使用全文索引的方法:
    SELECT * FROM [dbo].[FullTextIndexing] WHERE FREETEXT(Sentence,'全文索引');
    /*执行了几遍,耗时17402 毫秒
    SQL Server 分析和编译时间: 
       CPU 时间 = 16 毫秒,占用时间 = 21 毫秒。
    
    (851968 行受影响)
    表 'FullTextIndexing'。扫描计数 1,逻辑读取 15633 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    
     SQL Server 执行时间:
       CPU 时间 = 2230 毫秒,占用时间 = 17402 毫秒。
    */

     
    --    执行了17秒,不降反而上升了!!~
     
    --    重新生成全文目录!~再执行(更多方法有待参考:使用全文搜索查询 SQL Server)
    --    https://msdn.microsoft.com/zh-cn/library/ms142559(v=sql.105).aspx
    ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD;
    GO
    SELECT * FROM [dbo].[FullTextIndexing] WHERE FREETEXT(Sentence,'全文索引');
    SELECT * FROM [dbo].[FullTextIndexing] WHERE CONTAINS(Sentence,'全文索引');
    SELECT * FROM [dbo].[FullTextIndexing] WHERE CONTAINS(Sentence,'全文 AND 索引');
    
    /*这时快多了!~不到1秒就查询完成!~但是返回的行数才1000多行
    
    SQL Server 分析和编译时间: 
       CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
    
    (8853 行受影响)
    表 'FullTextIndexing'。扫描计数 0,逻辑读取 27121 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    
     SQL Server 执行时间:
       CPU 时间 = 78 毫秒,占用时间 = 944 毫秒。
    */
    SET STATISTICS IO OFF
    SET STATISTICS TIME OFF
     
    不断地执行就会找出规律:
    表扫描次数为0。
    逻辑读也越来越多,耗时越来越多,查询返回的行数也越来越多,性能越来越差!~比"like"还差
    最后还得重建重组(REBUILD/REORGANIZE)全文索引目录
    
    逻辑读取 27121 次
    逻辑读取 945268 次
    逻辑读取 1212885 次
    逻辑读取 1407846 次
    逻辑读取 1736686 次
    逻辑读取 1953265
     
    --    查询句词拆分结果.可以看到按什么词语进行匹配查询
    select * from sys.dm_fts_parser('全文索引',2052,5,0)
    
    
    --    如果只需要全文键或排名的信息,可使用表值函数
    --    使用表值函数的方法可以使用联接提示或查询提示(LOOP/MERGE/HASH)
    ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD;
    GO
    ALTER FULLTEXT CATALOG [Catalog_Test] REORGANIZE;
    GO
    
    SELECT * FROM [dbo].[FullTextIndexing] t1 
    INNER JOIN CONTAINSTABLE([FullTextIndexing],Sentence,'概述') AS t2
    ON t1.ID = t2.[KEY]
    GO
    
    SELECT * FROM [dbo].[FullTextIndexing] t1 
    INNER JOIN FREETEXTTABLE([FullTextIndexing],Sentence,'概述',LANGUAGE 2052,1000) AS t2
    ON t1.ID = t2.[KEY]
    ORDER BY t2.RANK DESC;
    GO
     
    --    相关视图:
    select * from sys.syslanguages
    select * from sys.fulltext_indexes
    select * from sys.fulltext_catalogs where name = 'Catalog_Test'
    select * from sys.dm_fts_active_catalogs where name = 'Catalog_Test'
    select * from sys.fulltext_stoplists where name = 'Stoplist_Test'
    select * from sys.fulltext_stopwords where stoplist_id = 5 --and language_id = 2052
    select * from sys.dm_fts_parser('全文索引',2052,5,0)

    原文链接

  • 相关阅读:
    CF1137FMatches Are Not a Child‘s Play【LCT】
    P4491[HAOI2018]染色【多项式,二项式反演】
    P3170[CQOI2015]标识设计【插头dp】
    log4j 使用教程说明
    log4j中Logger.getLogger()加载一个类提示错误
    编程基础 0x00008 的0x代表什么?
    编程基础 快速的进行 2进制,10进制,16进制 的 相互转换
    Java 基础 equals,hashcode和==的区别
    位运算 左移右移运算符 >>, <<, >>>
    Java 虚拟机 2.2 运行时数据区 Runtime Data Area
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/6934969.html
Copyright © 2011-2022 走看看