首页 技术 正文
技术 2022年11月14日
0 收藏 385 点赞 3,004 浏览 4600 个字
--    创建测试表
-- 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 15SELECT 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 FullTextIndexingSET STATISTICS IO ON
SET STATISTICS TIME ONSELECT * 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 毫秒。
*/

SqlServer 全文索引指令大全(转载)

 

--    使用全文索引的方法:
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 毫秒。
*/

SqlServer 全文索引指令大全(转载)

 

--    执行了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;
GOSELECT * FROM [dbo].[FullTextIndexing] t1
INNER JOIN CONTAINSTABLE([FullTextIndexing],Sentence,'概述') AS t2
ON t1.ID = t2.[KEY]
GOSELECT * 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)

原文链接

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,022
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,513
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,359
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,142
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,773
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,851