sql性能优化:sql Server 怎么添加全文索引+语法深度剖析+测试
如果對“簡述”、“概述” 不感謝請求可以直接跳到“三、添加全文索引”
一、簡述
在SQL Server 中提供了一種名為全文索引的技術,可以大大提高從長字符串里搜索數
據的速度,不用在用LIKE這樣低效率的模糊查詢了。
二、全文索引概念
官方:https://docs.microsoft.com/zh-cn/sql/relational-databases/search/full-text-search?view=sql-server-ver15?
1.全文索引是針對數據表,只能對表創建全文索引,不能對數據庫創建全文索引。
2.每個數據庫可以不包含全文目錄或包含多個全文目錄,一個全文目錄可以包含多個全文索引,但一個全文索引只能用于構成一個全文目錄。
3.一個數據表只能創建一個全文索引,一個全文索引可以包含多個字段。
4.創建全文索引的表必須要有一個唯一的非空索引,并且這個唯一的非空的索引只能是一個字段,不能是組合字段。
5.每個表只允許有一個全文索引。若要對某個表創建全文索引,該表必須具有一個唯一且非 Null 的列。您可以對以下類型的列創建全文索引:char、varchar、nchar、nvarchar、text、ntext、image、xml、varbinary 和 varbinary(max),從而可對這些列進行全文搜索。對數據類型為 varbinary、varbinary(max)、image 或 xml 的列創建全文索引需要您指定類型列。類型列是用來存儲每行中文檔的文件擴展名(.doc、.pdf、xls 等)的表列。
全文搜索由全文引擎提供支持。全文引擎有兩個角色:索引支持和查詢支持。
全文索引包括表中一個或多個基于字符的列。 這些列可以具有以下任何數據類型:char、varchar、nchar、nvarchar、text、ntext、image、xml?或?varbinary(max)?和?FILESTREAM。 每個全文索引都對表中的一個或多個列創建索引,并且每個列都可以使用特定語言。
全文查詢根據特定語言(例如,英語或日語)的規則對詞和短語進行操作,從而依據全文索引中的文本數據執行語言搜索。 全文查詢可以包括簡單的詞和短語,或者詞或短語的多種形式。 全文查詢返回包含至少一個匹配項(也稱為“命中”)的所有文檔。 當目標文檔包含在全文查詢中指定的所有字詞,并符合任何其他搜索條件(如匹配的字詞之間的距離)時,即發生匹配。
全文搜索體系結構
全文搜索體系結構包括以下進程:
-
SQL Server 進程 (sqlservr.exe)。
-
篩選器后臺程序宿主進程 (fdhost.exe)。
為了安全起見,篩選器由稱為篩選器后臺程序宿主的單獨進程加載。 fdhost.exe 進程是由 FDHOST 啟動器服務 (MSSQLFDLauncher) 創建的,這些進程使用 FDHOST 啟動器服務帳戶的安全憑據運行。 因此,必須運行 FDHOST 啟動器服務才能正常進行全文索引和全文查詢。 有關設置此服務的服務帳戶的信息,請參閱?設置用于全文篩選器后臺程序啟動器的服務帳戶。
這兩個進程包含全文搜索體系結構的各組件。 下圖概括了這些組件及其關系。??
全文搜索查詢與 LIKE 謂詞的對比
與全文搜索不同,LIKE?Transact-SQL 謂詞僅對字符模式有效。 另外,不能使用 LIKE 謂詞來查詢格式化的二進制數據。 此外,對大量非結構化的文本數據執行 LIKE 查詢要比對相同數據執行同樣的全文查詢慢得多。 對數百萬行文本數據進行的 LIKE 查詢可能需要幾分鐘的時間才能返回結果;而對于同樣的數據,全文查詢只需要幾秒甚至更少的時間,具體取決于返回的行數。
每個表只允許有一個全文索引
若要對某個表創建全文索引,該表必須具有一個唯一且非 Null 的列。 你可以在?char、?varchar、?nchar、?nvarchar、?text、?ntext、?image、?xml、?varbinary?類型的列上生成全文索引,并且可對?varbinary(max)?索引以進行全文搜索。 在數據類型為?varbinary、?varbinary(max)?、?image?或?xml?的列上創建全文索引需要你指定類型列。?類型列?是用來存儲每行中文檔的文件擴展名(.doc、.pdf、xls 等)的表列。
三、添加全文索引
下面簡明的介紹如何使用Sql2008 全文索引
3.1檢查服務里面帶有Full-text字樣的服務是否存在并開啟
?如果不存在帶有Full-text字樣的服務的,確認是否安裝了sqlserverFullTextSearch
--檢查數據庫PS2是否支持全文索引,如果不支持
--則使用sp_fulltext_database 打開該功能?
3.2新建全文目錄
?
全文目錄是用來存儲全文索引的
3.3為表定義全文索引
?3.4點擊下一步,按提示選擇
3.4.1確認下一步
用語句創建全文目錄??
CREATE FULLTEXT CATALOG [FD_HouseSearch]WITH ACCENT_SENSITIVITY = ON AS DEFAULT AUTHORIZATION [dbo]?3.4.2選擇唯一索引,通常是主鍵
?3.4.3選擇要建立的全文索引列,對于斷字符的選擇如果列存的是中文就選擇chinese,如果是英文就選擇English
選擇需要全文搜索的列,并且選擇斷字符語言,因為該字段主要用來存儲中文,所以這里也選擇了簡體中文。
斷字符:斷字符用來對全文搜索數據進行語言分析,查找單詞的邊界,也就是怎樣將一段很長的內容拆分成日常的詞語或字。例如“全文搜索”,可能會斷字成“全文”、‘搜索’、‘全’、‘文’、‘搜’、‘索’等符合中國人正常的習慣的詞或字。?
后期可以通過《表》鼠標右鍵>全文索引>屬性>會彈出新的窗口>選擇“列表”>修改“斷字符語言”
?
3.4.4?選擇索引更新方式,可以先自動更新,以后數據量大了可以設置添加全文索引的計劃
?
?3.4.5 選擇全文目錄
選擇全文目錄、索引文件、非索引字表
非索引字表:在剛才的斷字中講了怎樣斷字,這里就是將斷的字保存在一張表中,該處選擇系統默認的非索引字表.
----查詢斷字表 SELECT TOP 1000 * FROM sys.dm_fts_index_keywords(db_id(''), object_id(''))?用語句創建全文索引
--語句少了很多默認參數,其它就按系統默認即可 CREATE FULLTEXT INDEX ON dbo.Housetest (Description ) KEY INDEX PK_Housetest ON FD_HouseSearch?四、全文索引的SQL查詢關鍵字
建立好全文索引后就可以使用SQL語句來查詢了,主要用帶三個關鍵字 CONTAINS、FREETEXT、CONTAINSTABLE和FREETEXTTABLE
4.1 CONTAINS
搜索單個詞和短語的精確或模糊的匹配項,要搜索的內容必須是個有意義的詞語,比如說“蘋果”、“建設廳”,不能是一些沒意義的詞語,比如“阿迪撒啊是”,“兒兒的”這樣的詞語即使
LIKE是能查詢出來,但全文索引對這樣沒意義的詞語可能沒有建立索引,查不出來
詳細查看:CONTAINS (Transact-SQL) - SQL Server | Microsoft Docs
SELECT * FROM dbo.Business WHERE CONTAINS(Address,'旅游')?實現功能:查詢Business表中Address列包含“旅游”的行
?4.2?FREETEXT
?和CONTAINS類似,不同的是它會先把要查詢的詞語先進性分詞然后在查詢匹配項
?詳細查看:FREETEXT (Transact-SQL) - SQL Server | Microsoft Docs
select * from dbo.Business where freetext(Address,'帶嬰兒旅游')?
4.3 CONTAINS ?和 FREETEXT 的區別
SELECT id, name FROM Teacher WHERE CONTAINS(note, 'heard')SELECT id, name FROM Teacher WHERE FREETEXT(note, 'heard')?這兩個結果集 的區別 第一個 出來 0 條 第二個出來2條
原因是??FREETEXT 相較于?CONTAINS 比較松散 可以 查出 'hearder'?
咋一看來 感覺FREETEXT 比?CONTAINS ?比起來 更靈活好用 其實不然?
?4.4?CONTAINS? 的高級用法
- 對多列進行匹配
- 與或非邏輯
- 模糊匹配 支持 英文單詞的變形
- 通配符
- 查詢權重
以下的例子 都是從 sqlserver 官方文檔 獲取的
--多列查詢 SELECT Name, ListPrice FROM Production.Product WHERE ListPrice = 80.99 AND CONTAINS((Name,title), 'Mountain'); --column_list指定以逗號分隔的兩個或更多個列。 column_list 必須用括號括起來。 除非指定 --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*" '); -------------------------------------------------------------------------------------- --查詢權重 SELECT Description FROM Production.ProductDescription WHERE CONTAINS(Description, 'ISABOUT (performance weight (.8), comfortable weight (.4), smooth weight (.2) )' ); --------------------------------------------------------------------------------------- -- NEAR 使用 -- 以下示例在 Production.ProductReview 表中搜索包含 bike 一詞、在“control”詞的 10 個詞范圍內且使用指定順序(即,“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 的權重大于 PJ* 的結果集4.5 CONTAINSTABLE
在查詢方式上與 CONTAINS 幾乎一樣。但CONTAINSTABLE 返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用,并且使用 CONTAINSTABLE 的查詢對每一行返回一個相關性排名值 (RANK) 和全文鍵 (KEY)。?
?詳細查看: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 DESCISABOUT?是這種查詢的關鍵字,weight?指定了一個介于?0~1之間的數,類似系數。表示不同條件有不同的側重。
CONTAINSTABLE 返回的表包含有特殊的兩列:KEY,RANK。
被全文索引的表必須有唯一索引。這個唯一的索引列在返回的表中就成為 KEY。我們通常把它作為表連接的條件。
在某些網站搜索時,結果中會出現表示匹配程度的數字,RANK 與此類似。它的值在0~1000之間,標識每一行與查詢條件的匹配程度,程度越高,RANK 的值大,通常情況下,按照 RANK 的降序排列。
4.6?FREETEXTTABLE
在查詢方式上與?FREETEXT?幾乎一樣。但 FREETEXTTABLE?返回的是符合查詢條件的表,在 SQL 語句中我們可以把它當作一個普通的表來使用,并且使用? FREETEXT??的查詢對每一行返回一個相關性排名值 (RANK) 和全文鍵 (KEY)。
詳細查看: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?
?
五、全文索引相關命令
--activate,是激活表的全文檢索能力,也就是在全文目錄中注冊該表
execute sp_fulltext_table 'ProSearch','activate'--填充全文索引目錄
execute sp_fulltext_catalog 'ProSearchCatalog','start_full'--查詢全文索引是否建立完畢(0:完畢;1:正在建立)
select fulltextcatalogproperty('ProSearchCatalog','populateStatus')查看全文檢索的配置情況:
sp_help_fulltext_catalogs -- 檢查數據庫有哪些全文目錄 sp_help_fulltext_tables ProSearchCatalog -- 查看哪些表把全文索引建立在T_testData下 sp_help_fulltext_columns ProSearch -- 查看test表哪些字段配置了全文索引刪除全文索引必須與創建的時候倒過來一步一步操作:
drop fulltext index on test -- 撤銷test上的全文檢索 drop fulltext catalog FT_testData -- 撤銷全文目錄FT_testData5.1?創建測試表
DROP TABLE FullTextIndexing
CREATE TABLE FullTextIndexing (ID INT IDENTITY(1,1) NOT NULL,Sentence VARCHAR(MAX) )5.2 創建聚集索引
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 FullTextIndexing5.3 創建全文目錄
官方:CREATE FULLTEXT CATALOG (Transact-SQL) | Microsoft Docs
CREATE FULLTEXT CATALOG [Catalog_Test] WITHACCENT_SENSITIVITY = ON --區分重音AS DEFAULT --默認目錄AUTHORIZATION [dbo];--全文目錄的所有者 GO5.4 更改全文目錄的屬性
官方:ALTER FULLTEXT CATALOG (Transact-SQL) | Microsoft Docs
ALTER FULLTEXT CATALOG [Catalog_Test] REBUILD WITH ACCENT_SENSITIVITY = ON; --重新生成整個目錄并區分重音 --REORGANIZE; --重新組織全文目錄 --AS DEFAULT; --指定此目錄為默認目錄 GO5.5?從數據庫中刪除全文目錄(先刪除全文索引)
官方:DROP FULLTEXT CATALOG (Transact-SQL) | Microsoft Docs
DROP FULLTEXT CATALOG [Catalog_Test]; GO5.6?創建干擾字表
官方:CREATE FULLTEXT STOPLIST (Transact-SQL) | Microsoft Docs
CREATE FULLTEXT STOPLIST [Stoplist_Test] FROM SYSTEM STOPLIST AUTHORIZATION [dbo]; GO5.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 GO5.8?從數據庫中刪除全文本非索引字表
官方:DROP FULLTEXT STOPLIST (Transact-SQL) | Microsoft Docs
DROP FULLTEXT STOPLIST [Stoplist_Test]; GO5.9?創建全文索引
官方:CREATE FULLTEXT INDEX (Transact-SQL) | Microsoft Docs
CREATE FULLTEXT INDEX ON [dbo].[FullTextIndexing] (Sentence LANGUAGE 2052) --索引列,明確列中存儲的語言,方便過濾 KEY INDEX PK_FullTextIndexing --全文鍵:當前表中唯一索引名稱 ON [Catalog_Test] --指定全文目錄 WITH (STOPLIST [Stoplist_Test], --指定全文非索引字表CHANGE_TRACKING AUTO --自動填充); GO5.10?更改全文索引的屬性
官方:ALTER FULLTEXT INDEX (Transact-SQL) | Microsoft Docs
5.11?激活全文索引
ALTER FULLTEXT INDEX ON [dbo].[FullTextIndexing] ENABLE; GO5.12?刪除全文索引
官方:DROP FULLTEXT INDEX (Transact-SQL) | Microsoft Docs
DROP FULLTEXT INDEX ON [dbo].[FullTextIndexing]; GO5.13?測試
5.13 節點的所有代碼,是運行在一個sql文本里
常規查詢方法(先查詢全部數據,放到內存:154萬行31秒)
SELECT * FROM FullTextIndexingSET STATISTICS IO ON --開啟磁盤活動量的相關信息 SET STATISTICS TIME ON --開啟分析、編譯和執行各語句所需的毫秒數--SET STATISTICS IO (Transact-SQL) 是 導致 SQL Server 顯示 Transact-SQL 語句所生成的磁盤活動量的相關信息。 --官方:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-statistics-io-transact-sql?view=sql-server-ver15--關閉使用: --SET STATISTICS IO OFF--SET STATISTICS TIME (Transact-SQL) 顯示分析、編譯和執行各語句所需的毫秒數。 --官方:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-statistics-time-transact-sql?view=sql-server-ver15--關閉使用: --SET STATISTICS TIME OFF 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 毫秒。?
執行了幾遍,耗時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)使用全文搜索查詢 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) 是 導致 SQL Server 顯示 Transact-SQL 語句所生成的磁盤活動量的相關信息。 --官方: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) 顯示分析、編譯和執行各語句所需的毫秒數。 --官方:https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-statistics-time-transact-sql?view=sql-server-ver15SET STATISTICS TIME OFF這時快多了!~不到1秒就查詢完成!~但是返回的行數才1000多行
SQL Server 分析和編譯時間:?
CPU 時間 = 0 毫秒,占用時間 = 0 毫秒。
(8853 行受影響)
表 'FullTextIndexing'。掃描計數 0,邏輯讀取 27121 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
SQL Server 執行時間:
CPU 時間 = 78 毫秒,占用時間 = 944 毫秒。
5.14?查詢句詞拆分結果.可以看到按什么詞語進行匹配查詢
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; GO5.15?相關視圖
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)六、概念和實例
6.1概念-全文謂詞
全文查詢使用全文謂詞(CONTAINS 和 FREETEXT)以及全文函數(CONTAINSTABLE 和 FREETEXTTABLE)。它們支持復雜的 Transact-SQL 語法,這種語法支持各種形式的查詢詞。若要編寫全文查詢,必須了解何時以及如何使用這些謂詞和函數。
CONTAINS 謂詞可以搜索:
1.詞或短語。
2.詞或短語的前綴。
3.與另一個詞相鄰的詞。
4.由另一個詞的詞形變化而生成的詞(例如,drive 一詞是 drives、drove、driving 和 driven 詞形變化的詞干)。
5.使用同義詞庫確定的另一個詞的同義詞(例如,metal 一詞可能有 aluminum 和 steel 等同義詞)。
?
6.2 實例
? 表數據100萬條,
? title類似于文章的標題,
? Description是內容也是全文索引字段
方案1:like,測試后果斷排除
方案2:直接使用全文搜索進行,排序消耗大。
方案3:由于查詢需要對Title進行排序,建Title字段的倒序索引包含其它字段,最后選擇該方案(創建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]創建索引
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七、總結
全文索引功能類似于百度的搜索引擎,但是百度這類搜索引擎有自己的數據字典,在關鍵字表中對關鍵字進行排序,保存關鍵字對應的 文檔id,一個文檔只會保留很少的關鍵字,就跟平時寫文章要添加標簽一樣,一般一篇文章就幾個標簽,當搜索的時候匹配的速度就會非常快,這就需要一個很完善的數據字典表。
全文搜索還有另外的一個功能就是FileStream,需要添加文件流,在服務中啟用該功能可以在字段中將文檔以二進制的形式保存在字段當中,這樣大型文檔也可以隨數據庫一起備份,很多網站存儲圖片都是存儲圖片的路徑,這樣備份數據庫的時候圖片不會一起備份。
全文索引帶來好處的同時也會對性能有一定的影響,特別是在進行篩選操作的時候對服務器性能會帶來影響,所以選擇一個功能的同時需要考慮對性能帶來的影響。?
參考/轉載
sqlserver如何添加全文索引 - 鋒齊葉落 - 博客園在SQL Server 中提供了一種名為全文索引的技術,可以大大提高從長字符串里搜索數 據的速度,不用在用LIKE這樣低效率的模糊查詢了。 在SQL Server 中提供了一種名為全文索引的技術,可以https://www.cnblogs.com/qianzf/p/7131741.html
SQL Server 使用全文索引進行頁面搜索_沉寂的石頭-CSDN博客標簽:SQL SERVER/MSSQL SERVER/數據庫/DBA/全文索引概述??全文引擎使用全文索引中的信息來編譯可快速搜索表中的特定詞或詞組的全文查詢。全文索引將有關重要的詞及其位置的信息存儲在數據庫表的一列或多列中。全文索引是一種特殊類型的基于標記的功能性索引,它是由 SQL Server 全文引擎生成和維護的。生成全文索引的過程不同于生成其他類型的索引。全文引擎并非基于https://blog.csdn.net/chast_cn/article/details/50910827
sqlserver 全文索引 查詢使用規則_weixin_41301898的博客-CSDN博客_sqlserver全文索引具體 sqlserver 建立 全文索引 百度一下 很多 這里 補綴描述(要選擇好語言環境)CONTAINS andFREETEXT區別: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 全文索引創建及測試_公眾號:SQLServer-CSDN博客_sqlserver 全文索引創建--創建測試表--DROP TABLE FullTextIndexingCREATE TABLE FullTextIndexing(ID INT IDENTITY(1,1) NOT NULL,Sentence VARCHAR(MAX))--創建聚集索引ALTER TABLE FullTextIndexing ADD CONSTRAINT PK_FullTextIndexhttps://blog.csdn.net/kk185800961/article/details/45021471
總結
以上是生活随笔為你收集整理的sql性能优化:sql Server 怎么添加全文索引+语法深度剖析+测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己开计算机维修,自己维修笔记本电脑
- 下一篇: 服务器防火墙firewalld,指定端口