Sql-Server

VARCHAR(MAX) 列的索引

  • October 18, 2021

表結構:

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 毫秒。

引用自:https://dba.stackexchange.com/questions/301186