日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sql性能优化:sql Server 怎么添加全文索引+语法深度剖析+测试

發(fā)布時(shí)間:2023/12/16 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql性能优化:sql Server 怎么添加全文索引+语法深度剖析+测试 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

如果對(duì)“簡述”、“概述” 不感謝請(qǐng)求可以直接跳到“三、添加全文索引”

一、簡述

在SQL Server 中提供了一種名為全文索引的技術(shù),可以大大提高從長字符串里搜索數(shù)

據(jù)的速度,不用在用LIKE這樣低效率的模糊查詢了。

二、全文索引概念

官方:https://docs.microsoft.com/zh-cn/sql/relational-databases/search/full-text-search?view=sql-server-ver15

?

1.全文索引是針對(duì)數(shù)據(jù)表,只能對(duì)表創(chuàng)建全文索引,不能對(duì)數(shù)據(jù)庫創(chuàng)建全文索引。

2.每個(gè)數(shù)據(jù)庫可以不包含全文目錄或包含多個(gè)全文目錄,一個(gè)全文目錄可以包含多個(gè)全文索引,但一個(gè)全文索引只能用于構(gòu)成一個(gè)全文目錄。

3.一個(gè)數(shù)據(jù)表只能創(chuàng)建一個(gè)全文索引,一個(gè)全文索引可以包含多個(gè)字段。

4.創(chuàng)建全文索引的表必須要有一個(gè)唯一的非空索引,并且這個(gè)唯一的非空的索引只能是一個(gè)字段,不能是組合字段。

5.每個(gè)表只允許有一個(gè)全文索引。若要對(duì)某個(gè)表創(chuàng)建全文索引,該表必須具有一個(gè)唯一且非 Null 的列。您可以對(duì)以下類型的列創(chuàng)建全文索引:char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max),從而可對(duì)這些列進(jìn)行全文搜索。對(duì)數(shù)據(jù)類型為 varbinary、varbinary(max)、image 或 xml 的列創(chuàng)建全文索引需要您指定類型列。類型列是用來存儲(chǔ)每行中文檔的文件擴(kuò)展名(.doc、.pdf、xls 等)的表列。

全文搜索由全文引擎提供支持。全文引擎有兩個(gè)角色:索引支持和查詢支持。

全文索引包括表中一個(gè)或多個(gè)基于字符的列。 這些列可以具有以下任何數(shù)據(jù)類型:charvarcharncharnvarchartextntextimagexml?或?varbinary(max)?和?FILESTREAM。 每個(gè)全文索引都對(duì)表中的一個(gè)或多個(gè)列創(chuàng)建索引,并且每個(gè)列都可以使用特定語言。

全文查詢根據(jù)特定語言(例如,英語或日語)的規(guī)則對(duì)詞和短語進(jìn)行操作,從而依據(jù)全文索引中的文本數(shù)據(jù)執(zhí)行語言搜索。 全文查詢可以包括簡單的詞和短語,或者詞或短語的多種形式。 全文查詢返回包含至少一個(gè)匹配項(xiàng)(也稱為“命中”)的所有文檔。 當(dāng)目標(biāo)文檔包含在全文查詢中指定的所有字詞,并符合任何其他搜索條件(如匹配的字詞之間的距離)時(shí),即發(fā)生匹配。

全文搜索體系結(jié)構(gòu)

全文搜索體系結(jié)構(gòu)包括以下進(jìn)程:

  • SQL Server 進(jìn)程 (sqlservr.exe)。

  • 篩選器后臺(tái)程序宿主進(jìn)程 (fdhost.exe)。

    為了安全起見,篩選器由稱為篩選器后臺(tái)程序宿主的單獨(dú)進(jìn)程加載。 fdhost.exe 進(jìn)程是由 FDHOST 啟動(dòng)器服務(wù) (MSSQLFDLauncher) 創(chuàng)建的,這些進(jìn)程使用 FDHOST 啟動(dòng)器服務(wù)帳戶的安全憑據(jù)運(yùn)行。 因此,必須運(yùn)行 FDHOST 啟動(dòng)器服務(wù)才能正常進(jìn)行全文索引和全文查詢。 有關(guān)設(shè)置此服務(wù)的服務(wù)帳戶的信息,請(qǐng)參閱?設(shè)置用于全文篩選器后臺(tái)程序啟動(dòng)器的服務(wù)帳戶。

這兩個(gè)進(jìn)程包含全文搜索體系結(jié)構(gòu)的各組件。 下圖概括了這些組件及其關(guān)系。??

全文搜索查詢與 LIKE 謂詞的對(duì)比

與全文搜索不同,LIKE?Transact-SQL 謂詞僅對(duì)字符模式有效。 另外,不能使用 LIKE 謂詞來查詢格式化的二進(jìn)制數(shù)據(jù)。 此外,對(duì)大量非結(jié)構(gòu)化的文本數(shù)據(jù)執(zhí)行 LIKE 查詢要比對(duì)相同數(shù)據(jù)執(zhí)行同樣的全文查詢慢得多。 對(duì)數(shù)百萬行文本數(shù)據(jù)進(jìn)行的 LIKE 查詢可能需要幾分鐘的時(shí)間才能返回結(jié)果;而對(duì)于同樣的數(shù)據(jù),全文查詢只需要幾秒甚至更少的時(shí)間,具體取決于返回的行數(shù)。

每個(gè)表只允許有一個(gè)全文索引

若要對(duì)某個(gè)表創(chuàng)建全文索引,該表必須具有一個(gè)唯一且非 Null 的列。 你可以在?char、?varchar、?nchar、?nvarchar、?text、?ntext、?image、?xml、?varbinary?類型的列上生成全文索引,并且可對(duì)?varbinary(max)?索引以進(jìn)行全文搜索。 在數(shù)據(jù)類型為?varbinary、?varbinary(max)?、?image?或?xml?的列上創(chuàng)建全文索引需要你指定類型列。?類型列?是用來存儲(chǔ)每行中文檔的文件擴(kuò)展名(.doc、.pdf、xls 等)的表列。

三、添加全文索引

下面簡明的介紹如何使用Sql2008 全文索引

3.1檢查服務(wù)里面帶有Full-text字樣的服務(wù)是否存在并開啟

?如果不存在帶有Full-text字樣的服務(wù)的,確認(rèn)是否安裝了sqlserverFullTextSearch

--檢查數(shù)據(jù)庫PS2是否支持全文索引,如果不支持
--則使用sp_fulltext_database 打開該功能?

if(select databaseproperty('PS2','isfulltextenabled'))=0 execute sp_fulltext_database 'enable'

3.2新建全文目錄

?

全文目錄是用來存儲(chǔ)全文索引的

3.3為表定義全文索引

?3.4點(diǎn)擊下一步,按提示選擇

3.4.1確認(rèn)下一步

用語句創(chuàng)建全文目錄??

CREATE FULLTEXT CATALOG [FD_HouseSearch]WITH ACCENT_SENSITIVITY = ON AS DEFAULT AUTHORIZATION [dbo]

?3.4.2選擇唯一索引,通常是主鍵

?3.4.3選擇要建立的全文索引列,對(duì)于斷字符的選擇如果列存的是中文就選擇chinese,如果是英文就選擇English

選擇需要全文搜索的列,并且選擇斷字符語言,因?yàn)樵撟侄沃饕脕泶鎯?chǔ)中文,所以這里也選擇了簡體中文。

斷字符:斷字符用來對(duì)全文搜索數(shù)據(jù)進(jìn)行語言分析,查找單詞的邊界,也就是怎樣將一段很長的內(nèi)容拆分成日常的詞語或字。例如“全文搜索”,可能會(huì)斷字成“全文”、‘搜索’、‘全’、‘文’、‘搜’、‘索’等符合中國人正常的習(xí)慣的詞或字。?

后期可以通過《表》鼠標(biāo)右鍵>全文索引>屬性>會(huì)彈出新的窗口>選擇“列表”>修改“斷字符語言”

?

3.4.4?選擇索引更新方式,可以先自動(dòng)更新,以后數(shù)據(jù)量大了可以設(shè)置添加全文索引的計(jì)劃

?

?3.4.5 選擇全文目錄

選擇全文目錄、索引文件、非索引字表

非索引字表:在剛才的斷字中講了怎樣斷字,這里就是將斷的字保存在一張表中,該處選擇系統(tǒng)默認(rèn)的非索引字表.

----查詢斷字表 SELECT TOP 1000 * FROM sys.dm_fts_index_keywords(db_id(''), object_id(''))

?用語句創(chuàng)建全文索引

--語句少了很多默認(rèn)參數(shù),其它就按系統(tǒng)默認(rèn)即可 CREATE FULLTEXT INDEX ON dbo.Housetest (Description ) KEY INDEX PK_Housetest ON FD_HouseSearch

?四、全文索引的SQL查詢關(guān)鍵字

建立好全文索引后就可以使用SQL語句來查詢了,主要用帶三個(gè)關(guān)鍵字 CONTAINS、FREETEXT、CONTAINSTABLE和FREETEXTTABLE

4.1 CONTAINS

搜索單個(gè)詞和短語的精確或模糊的匹配項(xiàng),要搜索的內(nèi)容必須是個(gè)有意義的詞語,比如說“蘋果”、“建設(shè)廳”,不能是一些沒意義的詞語,比如“阿迪撒啊是”,“兒兒的”這樣的詞語即使

LIKE是能查詢出來,但全文索引對(duì)這樣沒意義的詞語可能沒有建立索引,查不出來

詳細(xì)查看:CONTAINS (Transact-SQL) - SQL Server | Microsoft Docs

SELECT * FROM dbo.Business WHERE CONTAINS(Address,'旅游')

?實(shí)現(xiàn)功能:查詢Business表中Address列包含“旅游”的行

?4.2?FREETEXT

?和CONTAINS類似,不同的是它會(huì)先把要查詢的詞語先進(jìn)性分詞然后在查詢匹配項(xiàng)

?詳細(xì)查看:FREETEXT (Transact-SQL) - SQL Server | Microsoft Docs

select * from dbo.Business where freetext(Address,'帶嬰兒旅游')

?

4.3 CONTAINS ?和 FREETEXT 的區(qū)別

SELECT id, name FROM Teacher WHERE CONTAINS(note, 'heard')SELECT id, name FROM Teacher WHERE FREETEXT(note, 'heard')

?這兩個(gè)結(jié)果集 的區(qū)別 第一個(gè) 出來 0 條 第二個(gè)出來2條

原因是??FREETEXT 相較于?CONTAINS 比較松散 可以 查出 'hearder'?

咋一看來 感覺FREETEXT 比?CONTAINS ?比起來 更靈活好用 其實(shí)不然?

?4.4?CONTAINS? 的高級(jí)用法

  • 對(duì)多列進(jìn)行匹配
  • 與或非邏輯
  • 模糊匹配 支持 英文單詞的變形
  • 通配符
  • 查詢權(quán)重

以下的例子 都是從 sqlserver 官方文檔 獲取的

--多列查詢 SELECT Name, ListPrice FROM Production.Product WHERE ListPrice = 80.99 AND CONTAINS((Name,title), 'Mountain'); --column_list指定以逗號(hào)分隔的兩個(gè)或更多個(gè)列。 column_list 必須用括號(hào)括起來。 除非指定 --language_term,否則 column_list 中所有列的語言必須相同。 -------------------------------------------------------------------------------------- -- 與或非 邏輯 SELECT Name, ListPrice FROM Production.Product WHERE ListPrice = 80.99 AND CONTAINS(Name, '"Mountain" AND "WENJIE"'); --<AND> ::={ AND | & } --<AND NOT> ::={ AND NOT | &! } --<OR> ::= { OR | | } -------------------------------------------------------------------------------------- -- 模糊匹配 支持 英文單詞變形 類似于 FREETEXT -- 可以讀出ride 的各種形式(如 riding 和 ridden 等)SELECT Description FROM Production.ProductDescription WHERE CONTAINS(Description, ' FORMSOF (INFLECTIONAL, ride) ')-------------------------------------------------------------------------------------- -- 通配符*的使用 SELECT Name FROM Production.Product WHERE CONTAINS(Name, ' "Chain*" '); -------------------------------------------------------------------------------------- --查詢權(quán)重 SELECT Description FROM Production.ProductDescription WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), comfortable weight (.4), smooth weight (.2) )' ); --------------------------------------------------------------------------------------- -- NEAR 使用 -- 以下示例在 Production.ProductReview 表中搜索包含 bike 一詞、在“control”詞的 10 個(gè)詞范圍內(nèi)且使用指定順序(即,“bike”排在“control”前面)的所有注釋。 SELECT Comments FROM Production.ProductReview WHERE CONTAINS(Comments , 'NEAR((bike,control), 10, TRUE)');

注意以上的 所以 可以 混合使用?

比如我這里的sql

SELECT * FROM sku_price WHERE CONTAINS(sku_desc, 'ISABOUT("PJ" weight (.8) ,"PJ*" weight (.2)) AND ISABOUT("PA" weight (.8) ,"PA*" weight (.2))')--查詢 sku_price 中 匹配 PJ 或者 PJ* 但是 PJ 的權(quán)重大于 PJ* 的結(jié)果集

4.5 CONTAINSTABLE

在查詢方式上與 CONTAINS 幾乎一樣。但CONTAINSTABLE 返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當(dāng)作一個(gè)普通的表來使用,并且使用 CONTAINSTABLE 的查詢對(duì)每一行返回一個(gè)相關(guān)性排名值 (RANK) 和全文鍵 (KEY)。?

?詳細(xì)查看:CONTAINSTABLE (SQL) - SQL Server | Microsoft Docs

SELECT * FROM Business AS FT_TBL INNER JOIN CONTAINSTABLE(Business, *, 'ISABOUT (嬰兒 WEIGHT (.8),赤水 WEIGHT (.4) )') AS KEY_TBL ON FT_TBL.BusinessId = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC

ISABOUT?是這種查詢的關(guān)鍵字,weight?指定了一個(gè)介于?0~1之間的數(shù),類似系數(shù)。表示不同條件有不同的側(cè)重。

CONTAINSTABLE 返回的表包含有特殊的兩列:KEY,RANK。

被全文索引的表必須有唯一索引。這個(gè)唯一的索引列在返回的表中就成為 KEY。我們通常把它作為表連接的條件。

在某些網(wǎng)站搜索時(shí),結(jié)果中會(huì)出現(xiàn)表示匹配程度的數(shù)字,RANK 與此類似。它的值在0~1000之間,標(biāo)識(shí)每一行與查詢條件的匹配程度,程度越高,RANK 的值大,通常情況下,按照 RANK 的降序排列。

4.6?FREETEXTTABLE

在查詢方式上與?FREETEXT?幾乎一樣。但 FREETEXTTABLE?返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當(dāng)作一個(gè)普通的表來使用,并且使用? FREETEXT??的查詢對(duì)每一行返回一個(gè)相關(guān)性排名值 (RANK) 和全文鍵 (KEY)。

詳細(xì)查看:FREETEXTTABLE (SQL) - SQL Server | Microsoft Docs

SELECT * , BusinessID , Address FROM Business AS FT_TBL INNER JOIN FREETEXTTABLE(Business, Address, 'ISABOUT (帶嬰兒旅游 WEIGHT (.8),赤水 WEIGHT (.4) )') AS KEY_TBL ON FT_TBL.BusinessId = KEY_TBL.[KEY] ORDER BY KEY_TBL.RANK DESC

?

?

五、全文索引相關(guān)命令

--activate,是激活表的全文檢索能力,也就是在全文目錄中注冊(cè)該表

execute sp_fulltext_table 'ProSearch','activate'

--填充全文索引目錄

execute sp_fulltext_catalog 'ProSearchCatalog','start_full'

--查詢?nèi)乃饕欠窠⑼戤?0:完畢;1:正在建立)

select fulltextcatalogproperty('ProSearchCatalog','populateStatus')

查看全文檢索的配置情況:

sp_help_fulltext_catalogs -- 檢查數(shù)據(jù)庫有哪些全文目錄 sp_help_fulltext_tables ProSearchCatalog -- 查看哪些表把全文索引建立在T_testData下 sp_help_fulltext_columns ProSearch -- 查看test表哪些字段配置了全文索引

刪除全文索引必須與創(chuàng)建的時(shí)候倒過來一步一步操作:

drop fulltext index on test -- 撤銷test上的全文檢索 drop fulltext catalog FT_testData -- 撤銷全文目錄FT_testData

5.1?創(chuàng)建測試表

DROP TABLE FullTextIndexing

CREATE TABLE FullTextIndexing (ID INT IDENTITY(1,1) NOT NULL,Sentence VARCHAR(MAX) )

5.2 創(chuàng)建聚集索引

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

重復(fù)15次,從47行變?yōu)?54萬行

INSERT INTO FullTextIndexing(Sentence) SELECT Sentence FROM FullTextIndexing GO 15SELECT COUNT(*) FROM FullTextIndexing

5.3 創(chuàng)建全文目錄

官方:CREATE FULLTEXT CATALOG (Transact-SQL) | Microsoft Docs

CREATE FULLTEXT CATALOG [Catalog_Test] WITHACCENT_SENSITIVITY = ON --區(qū)分重音AS DEFAULT --默認(rèn)目錄AUTHORIZATION [dbo];--全文目錄的所有者 GO

5.4 更改全文目錄的屬性

官方:ALTER FULLTEXT CATALOG (Transact-SQL) | Microsoft Docs

ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD WITH ACCENT_SENSITIVITY = ON; --重新生成整個(gè)目錄并區(qū)分重音 --REORGANIZE; --重新組織全文目錄 --AS DEFAULT; --指定此目錄為默認(rèn)目錄 GO

5.5?從數(shù)據(jù)庫中刪除全文目錄(先刪除全文索引)

官方:DROP FULLTEXT CATALOG (Transact-SQL) | Microsoft Docs

DROP FULLTEXT CATALOG [Catalog_Test]; GO

5.6?創(chuàng)建干擾字表

官方:CREATE FULLTEXT STOPLIST (Transact-SQL) | Microsoft Docs

CREATE FULLTEXT STOPLIST [Stoplist_Test] FROM SYSTEM STOPLIST AUTHORIZATION [dbo]; GO

5.7?添加刪除干擾字

官方:ALTER FULLTEXT STOPLIST (Transact-SQL) | Microsoft Docs

ALTER FULLTEXT STOPLIST [Stoplist_Test] ADD N'乎' LANGUAGE 2052; GO ALTER FULLTEXT STOPLIST [Stoplist_Test] DROP N'乎' language 2052; --ALL LANGUAGE 'English' --ALL GO

5.8?從數(shù)據(jù)庫中刪除全文本非索引字表

官方:DROP FULLTEXT STOPLIST (Transact-SQL) | Microsoft Docs

DROP FULLTEXT STOPLIST [Stoplist_Test]; GO

5.9?創(chuàng)建全文索引

官方:CREATE FULLTEXT INDEX (Transact-SQL) | Microsoft Docs

CREATE FULLTEXT INDEX ON [dbo].[FullTextIndexing] (Sentence LANGUAGE 2052) --索引列,明確列中存儲(chǔ)的語言,方便過濾 KEY INDEX PK_FullTextIndexing --全文鍵:當(dāng)前表中唯一索引名稱 ON [Catalog_Test] --指定全文目錄 WITH (STOPLIST [Stoplist_Test], --指定全文非索引字表CHANGE_TRACKING AUTO --自動(dòng)填充); GO

5.10?更改全文索引的屬性

官方:ALTER FULLTEXT INDEX (Transact-SQL) | Microsoft Docs

5.11?激活全文索引

ALTER FULLTEXT INDEX ON [dbo].[FullTextIndexing] ENABLE; GO

5.12?刪除全文索引

官方:DROP FULLTEXT INDEX (Transact-SQL) | Microsoft Docs

DROP FULLTEXT INDEX ON [dbo].[FullTextIndexing]; GO

5.13?測試

5.13 節(jié)點(diǎn)的所有代碼,是運(yùn)行在一個(gè)sql文本里

常規(guī)查詢方法(先查詢?nèi)繑?shù)據(jù),放到內(nèi)存:154萬行31秒)

SELECT * FROM FullTextIndexingSET STATISTICS IO ON --開啟磁盤活動(dòng)量的相關(guān)信息 SET STATISTICS TIME ON --開啟分析、編譯和執(zhí)行各語句所需的毫秒數(shù)--SET STATISTICS IO (Transact-SQL) 是 導(dǎo)致 SQL Server 顯示 Transact-SQL 語句所生成的磁盤活動(dòng)量的相關(guān)信息。 --官方:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-statistics-io-transact-sql?view=sql-server-ver15--關(guān)閉使用: --SET STATISTICS IO OFF--SET STATISTICS TIME (Transact-SQL) 顯示分析、編譯和執(zhí)行各語句所需的毫秒數(shù)。 --官方:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-statistics-time-transact-sql?view=sql-server-ver15--關(guān)閉使用: --SET STATISTICS TIME OFF

SELECT * FROM FullTextIndexing WHERE Sentence LIKE '%全文索引%'

執(zhí)行了幾遍,耗時(shí)13440 毫秒
SQL Server 分析和編譯時(shí)間:?
CPU 時(shí)間 = 0 毫秒,占用時(shí)間 = 0 毫秒。
(229376 行受影響)
表 'FullTextIndexing'。掃描計(jì)數(shù) 1,邏輯讀取 15633 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
SQL Server 執(zhí)行時(shí)間:
CPU 時(shí)間 = 11591 毫秒,占用時(shí)間 = 13440 毫秒。?

SELECT * FROM FullTextIndexing WHERE CHARINDEX('全文索引',Sentence)<>0

執(zhí)行了幾遍,耗時(shí)15338 毫秒
SQL Server 分析和編譯時(shí)間:?
CPU 時(shí)間 = 0 毫秒,占用時(shí)間 = 0 毫秒。
(229376 行受影響)
表 'FullTextIndexing'。掃描計(jì)數(shù) 1,邏輯讀取 15633 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
SQL Server 執(zhí)行時(shí)間:
CPU 時(shí)間 = 12714 毫秒,占用時(shí)間 = 15338 毫秒。

?

-- 使用全文索引的方法: SELECT * FROM [dbo].[FullTextIndexing] WHERE FREETEXT(Sentence,'全文索引');

執(zhí)行了幾遍,耗時(shí)17402 毫秒
SQL Server 分析和編譯時(shí)間:?
CPU 時(shí)間 = 16 毫秒,占用時(shí)間 = 21 毫秒。
(851968 行受影響)
表 'FullTextIndexing'。掃描計(jì)數(shù) 1,邏輯讀取 15633 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
SQL Server 執(zhí)行時(shí)間:
CPU 時(shí)間 = 2230 毫秒,占用時(shí)間 = 17402 毫秒。

?執(zhí)行了17秒,不降反而上升了!!~

重新生成全文目錄!~再執(zhí)行

(更多方法有待參考:使用全文搜索查詢 SQL Server)使用全文搜索查詢 SQL Server | Microsoft Docs

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 索引');--SET STATISTICS IO (Transact-SQL) 是 導(dǎo)致 SQL Server 顯示 Transact-SQL 語句所生成的磁盤活動(dòng)量的相關(guān)信息。 --官方:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-statistics-io-transact-sql?view=sql-server-ver15SET STATISTICS IO OFF--SET STATISTICS TIME (Transact-SQL) 顯示分析、編譯和執(zhí)行各語句所需的毫秒數(shù)。 --官方:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-statistics-time-transact-sql?view=sql-server-ver15SET STATISTICS TIME OFF

這時(shí)快多了!~不到1秒就查詢完成!~但是返回的行數(shù)才1000多行
SQL Server 分析和編譯時(shí)間:?
CPU 時(shí)間 = 0 毫秒,占用時(shí)間 = 0 毫秒。
(8853 行受影響)
表 'FullTextIndexing'。掃描計(jì)數(shù) 0,邏輯讀取 27121 次,物理讀取 0 次,預(yù)讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預(yù)讀 0 次。
SQL Server 執(zhí)行時(shí)間:
CPU 時(shí)間 = 78 毫秒,占用時(shí)間 = 944 毫秒。

不斷地執(zhí)行就會(huì)找出規(guī)律: 表掃描次數(shù)為0。 邏輯讀也越來越多,耗時(shí)越來越多,查詢返回的行數(shù)也越來越多,性能越來越差!~比"like"還差 最后還得重建重組(REBUILD/REORGANIZE)全文索引目錄邏輯讀取 27121 次 邏輯讀取 945268 次 邏輯讀取 1212885 次 邏輯讀取 1407846 次 邏輯讀取 1736686 次 邏輯讀取 1953265 次

5.14?查詢句詞拆分結(jié)果.可以看到按什么詞語進(jìn)行匹配查詢

select * from sys.dm_fts_parser('全文索引',2052,5,0) -- 如果只需要全文鍵或排名的信息,可使用表值函數(shù) -- 使用表值函數(shù)的方法可以使用聯(lián)接提示或查詢提示(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

5.15?相關(guān)視圖

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)

六、概念和實(shí)例

6.1概念-全文謂詞

全文查詢使用全文謂詞(CONTAINS 和 FREETEXT)以及全文函數(shù)(CONTAINSTABLE 和 FREETEXTTABLE)。它們支持復(fù)雜的 Transact-SQL 語法,這種語法支持各種形式的查詢?cè)~。若要編寫全文查詢,必須了解何時(shí)以及如何使用這些謂詞和函數(shù)。

CONTAINS 謂詞可以搜索:

1.詞或短語。
2.詞或短語的前綴。
3.與另一個(gè)詞相鄰的詞。
4.由另一個(gè)詞的詞形變化而生成的詞(例如,drive 一詞是 drives、drove、driving 和 driven 詞形變化的詞干)。
5.使用同義詞庫確定的另一個(gè)詞的同義詞(例如,metal 一詞可能有 aluminum 和 steel 等同義詞)。
?

---下面的示例將查找包含 "Mountain"USE AdventureWorks2008R2; GO SELECT Name, ListPrice FROM Production.Product WHERE CONTAINS(Name, 'Mountain'); GO --下面的示例將查找包含 "Mountain"或 "Road" USE AdventureWorks2008R2; GO SELECT Name FROM Production.Product WHERE CONTAINS(Name, ' "Mountain" OR "Road" ') GO ---下面的示例返回的所有產(chǎn)品名稱中,其 Name列中至少有一個(gè)詞以前輟 chain 開頭 USE AdventureWorks2008R2; GO SELECT Name FROM Production.Product WHERE CONTAINS(Name, ' "Chain*" '); GO

6.2 實(shí)例

? 表數(shù)據(jù)100萬條,
? title類似于文章的標(biāo)題,
? Description是內(nèi)容也是全文索引字段

方案1:like,測試后果斷排除

方案2:直接使用全文搜索進(jìn)行,排序消耗大。

方案3:由于查詢需要對(duì)Title進(jìn)行排序,建Title字段的倒序索引包含其它字段,最后選擇該方案(創(chuàng)建Title字段的倒序索引很重要)。

--給出部分字段 CREATE TABLE [dbo].[Housetest]([ID] [int] IDENTITY(1,1) NOT NULL,[Title] [varchar](200) NULL,[Description] [nvarchar](max) NOT NULL,[IsOnline] [tinyint] NOT NULL,CONSTRAINT [PK_Housetest] PRIMARY KEY CLUSTERED ([ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

創(chuàng)建索引

CREATE INDEX IX_Housetest ON Housetest (Title DESC ) INCLUDE (ID, Description, IsOnline )

查詢Description包含“美園”,并且如果Title是“美園”則排在第一位,并且以分頁的形式顯示,每頁20條記錄。

select * from (SELECT ROW_NUMBER() OVER(Order by (case when Title='美園' Then 1 Else 0 End) desc ) as RowsNumber,ID,Title,DescriptionFrom HousetestWhere contains(Description,'美園') and IsOnline=1) tab1 where RowsNumber between 1 and 20

七、總結(jié)

全文索引功能類似于百度的搜索引擎,但是百度這類搜索引擎有自己的數(shù)據(jù)字典,在關(guān)鍵字表中對(duì)關(guān)鍵字進(jìn)行排序,保存關(guān)鍵字對(duì)應(yīng)的 文檔id,一個(gè)文檔只會(huì)保留很少的關(guān)鍵字,就跟平時(shí)寫文章要添加標(biāo)簽一樣,一般一篇文章就幾個(gè)標(biāo)簽,當(dāng)搜索的時(shí)候匹配的速度就會(huì)非常快,這就需要一個(gè)很完善的數(shù)據(jù)字典表。

全文搜索還有另外的一個(gè)功能就是FileStream,需要添加文件流,在服務(wù)中啟用該功能可以在字段中將文檔以二進(jìn)制的形式保存在字段當(dāng)中,這樣大型文檔也可以隨數(shù)據(jù)庫一起備份,很多網(wǎng)站存儲(chǔ)圖片都是存儲(chǔ)圖片的路徑,這樣備份數(shù)據(jù)庫的時(shí)候圖片不會(huì)一起備份。

全文索引帶來好處的同時(shí)也會(huì)對(duì)性能有一定的影響,特別是在進(jìn)行篩選操作的時(shí)候?qū)Ψ?wù)器性能會(huì)帶來影響,所以選擇一個(gè)功能的同時(shí)需要考慮對(duì)性能帶來的影響。?

參考/轉(zhuǎn)載

sqlserver如何添加全文索引 - 鋒齊葉落 - 博客園在SQL Server 中提供了一種名為全文索引的技術(shù),可以大大提高從長字符串里搜索數(shù) 據(jù)的速度,不用在用LIKE這樣低效率的模糊查詢了。 在SQL Server 中提供了一種名為全文索引的技術(shù),可以https://www.cnblogs.com/qianzf/p/7131741.html

SQL Server 使用全文索引進(jìn)行頁面搜索_沉寂的石頭-CSDN博客標(biāo)簽:SQL SERVER/MSSQL SERVER/數(shù)據(jù)庫/DBA/全文索引概述??全文引擎使用全文索引中的信息來編譯可快速搜索表中的特定詞或詞組的全文查詢。全文索引將有關(guān)重要的詞及其位置的信息存儲(chǔ)在數(shù)據(jù)庫表的一列或多列中。全文索引是一種特殊類型的基于標(biāo)記的功能性索引,它是由 SQL Server 全文引擎生成和維護(hù)的。生成全文索引的過程不同于生成其他類型的索引。全文引擎并非基于https://blog.csdn.net/chast_cn/article/details/50910827

sqlserver 全文索引 查詢使用規(guī)則_weixin_41301898的博客-CSDN博客_sqlserver全文索引具體 sqlserver 建立 全文索引 百度一下 很多 這里 補(bǔ)綴描述(要選擇好語言環(huán)境)CONTAINS andFREETEXT區(qū)別:SELECT id, name FROM TeacherWHERE CONTAINS(note, 'heard')SELECT id, name FROM TeacherWHERE FREETEXT(note, 'heard')這...https://blog.csdn.net/weixin_41301898/article/details/89373214

SqlServer 全文索引創(chuàng)建及測試_公眾號(hào):SQLServer-CSDN博客_sqlserver 全文索引創(chuàng)建--創(chuàng)建測試表--DROP TABLE FullTextIndexingCREATE TABLE FullTextIndexing(ID INT IDENTITY(1,1) NOT NULL,Sentence VARCHAR(MAX))--創(chuàng)建聚集索引ALTER TABLE FullTextIndexing ADD CONSTRAINT PK_FullTextIndexhttps://blog.csdn.net/kk185800961/article/details/45021471

總結(jié)

以上是生活随笔為你收集整理的sql性能优化:sql Server 怎么添加全文索引+语法深度剖析+测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。