我們正在對帶有列字串的資料庫表進行通配符搜索。在列上創建非聚集索引是否有助于通配符搜索?這會提高性能嗎?
CREATE TABLE [dbo].[Product](
[ProductId] [int] NOT NULL,
[ProductName] [varchar](250) NOT NULL,
[ModifiedDate] [datetime] NOT NULL,
...
CONSTRAINT [PK_ProductId] PRIMARY KEY CLUSTERED
(
[ProductId] ASC
)
)
建議指數:
CREATE NONCLUSTERED INDEX [IX_Product_ProductName] ON [dbo].[Product] [ProductName])
對于這個查詢
select * from dbo.Product where ProductName like '%furniture%'
當前使用 Microsoft SQL Server 2019。
uj5u.com熱心網友回復:
對于如圖所示的雙端通配符搜索,索引無法通過限制 SQL Server 必須查看的行來幫助您 - 將執行全表掃描。但它可以幫助處理必須從磁盤檢索的資料量。
因為 in ProductName like '%furniture%',ProductName可以以任何字串開頭或結尾,所以沒有索引可以減少必須檢查的行。
但是,如果Product表中的一行是 1,000 個字符,而您有 10,000 行,則必須加載那么多資料。但是如果您在 上有一個索引ProductName,并且ProductName只有 50 個字符,那么您只需加載 10,000 * 50 而不是 10,000 * 1000。
注意:如果查詢是在 % 結尾的單端通配符搜索'furniture%',那么建議的索引肯定會有所幫助。
uj5u.com熱心網友回復:
創建普通索引無濟于事,但全文索引會有所幫助,盡管您必須將查詢更改為以下內容:
select * from dbo.Product where ProductName CONTAINS 'furniture'
uj5u.com熱心網友回復:
是的,第一個之前的部分%與索引匹配。當然,如果您的模式以 開頭%,則將執行完整掃描。
uj5u.com熱心網友回復:
這取決于優化器。像通常需要全表掃描。如果優化器可以掃描索引以查找匹配項,那么它將執行比全表掃描更快的索引掃描。
如果優化器沒有選擇索引掃描,您可以強制它使用索引。您必須測量性能時間以確定使用索引掃描是否會減少搜索時間
使用with (index(index_name))強制索引掃描如
select * from t1 with (index(t1i1)) where v1 like '456%'
SQL Server 索引 - LIKE 查詢的任何改進?
如果使用%search%模式,優化器將始終執行全表掃描。
另一種加速搜索的技術是使用子字串和精確匹配搜索。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/357314.html
