VARCHAR(MAX) 列的索引
表結構:
textvalue
有索引,長度為 900
longtextvalue
沒有索引,長度為 MAX目標是將長度為 MAX 的列和索引放在一起。因此
longtextvalue
可以將其刪除並且僅textvalue
保留,但可以使用索引儲存 longtextvalues。它適用於 PostgreSQL、Oracle 和 CLOB,但不適用於 Microsoft SQL Server。執行的查詢將是
=
查詢Fine 將是一個過濾索引,最多可以使用 900 個字元,並且對於上面的所有內容都沒有索引。但是使用該過濾後的索引作為大小將需要 LEN() 函式,該函式不起作用。使用計算列的解決方法也不起作用:
textvalue_size 列 = LEN(文本值)。
有大小作為幫助。然後 textvalue 或 textvalue_size 上的過濾索引不起作用,因為 SQL Server 不支持計算列上的過濾索引。
因此,有沒有一種方法可以組合這兩列而不使用需要額外目錄的全文索引?
SQL Server 版本:2014 及更高版本
對於寬字元列,最好的辦法是計算校驗和並添加索引。
然後計算您正在搜尋的內容的校驗和並將其添加到您的查詢中,如下所示:
-- add a persisted computed column, we will calculate a checksum over the body column which is of type nvarchar(max) alter table dbo.posts add chksum_body as checksum(body) persisted -- add an nonclustered index to the table for the new column create nonclustered index ncix_posts_chksum_body on dbo.posts (chksum_body) -- show query io and cpu usage set statistics io, time on -- we need 2 variables, one for the string we are searching for and one for its checksum declare @str nvarchar(max) declare @chksumstr int -- initialise the variable with the search string select @str = N'Can anyone help me to index wide columns in SQL Server please' -- calculate a checksum for the search string and store in a variable select @chksumstr = checksum(@str) -- compare search the old way (no index) select top 100 * from [dbo].[Posts] where body = N'Can anyone help me to index wide columns in SQL Server please' -- to search using the checksum, note we recheck the value of the body to eliminate any false matches due to checksum collisions -- but as we have an index seek we just are doing a residual filter on the few matching rows select top 100 * from [dbo].[Posts] where body = @str and chksum_body = @chksumstr
SQL Server 執行時間:CPU 時間 = 0 毫秒,經過時間 = 0 毫秒。
(受影響的 1 行)
表“文章”。掃描計數 5,邏輯讀取 4239877,物理讀取 2150,頁面伺服器讀取 0,預讀讀取 4194084,頁面伺服器預讀讀取 0,lob 邏輯讀取 677199,lob 物理讀取 407176,lob 頁面伺服器讀取 0,lob 讀取-預讀為 0,lob 頁面伺服器預讀為 0。表“工作表”。掃描計數 0,邏輯讀取 0,物理讀取 0,頁面伺服器讀取 0,預讀讀取 0,頁面伺服器預讀讀取 0,lob 邏輯讀取 0,lob 物理讀取 0,lob 頁面伺服器讀取 0,lob 讀取預讀為 0,lob 頁面伺服器預讀為 0。
SQL Server 執行時間:CPU 時間 = 34829 毫秒,經過時間 = 36995 毫秒。
(受影響的 1 行)
表“文章”。掃描計數 1,邏輯讀取 7,物理讀取 4,頁面伺服器讀取 0,預讀讀取 0,頁面伺服器預讀讀取 0,lob 邏輯讀取 0,lob 物理讀取 0,lob 頁面伺服器讀取 0,lob 讀取-預讀為 0,lob 頁面伺服器預讀為 0。
SQL Server 執行時間:CPU 時間 = 0 毫秒,經過時間 = 0 毫秒。