got*_*tqn 2 sql-server computed-column sql-server-2019
我有一个具有以下结构的表:
ItemID int
ItemType char(1)
Language char(2)
Localization char(2)
Literal nvarchar(4000)
Run Code Online (Sandbox Code Playgroud)
用于将特定的文本翻译ItemID为Literal一个。该Literal列可能包含HTML标签。对于一组特定的查询,HTML需要删除这些标记,并且因为清理是使用 SQL CLR 对数千行完成的,所以我不想在读取时执行此类操作。
所以,我添加了一个像这样的持久列:
ALTER TABLE [dbo].[table]
ADD [LiteralSanitized] AS NULLIF(CAST(LTRIM(RTRIM([dbo].[fn_Utils_RemoveAllHtmlTags] ([Literal]))) AS NVARCHAR(4000)), '') PERSISTED;
Run Code Online (Sandbox Code Playgroud)
该表只有一个索引(主键),定义如下:
ItemID, ItemType, Language, Localization
Run Code Online (Sandbox Code Playgroud)
所以查询速度更快,但我看到这个表有一些额外的读取:
Scan count - 2 vs 12,230
Logical reads - 3,234 vs 43,472
Run Code Online (Sandbox Code Playgroud)
这可能是正常的,因为现在我因为该列而读取了更多数据。所以,我添加了以下索引:
(ItemID ASC, ItemType ASC, Language ASC, Localization ASC) INCLUDE ([LiteralSanitized])
Run Code Online (Sandbox Code Playgroud)
但它不被引擎使用。所以,我尝试强制引擎使用它:
UPDATE #temp
SET [QuestionText] = PSGQ.[LiteralSanitized]
FROM #temp PQD
INNER JOIN [dbo].[table_with_translations] PSGQ WITH(INDEX = [the_new_index])
ON PQD.[ProtoQuestionID] = PSGQ.[ItemID]
WHERE PSGQ.[ItemType] = 'Q'
AND PSGQ.[Language] = @language
AND RTRIM(PSGQ.[Localization]) = ''
AND PSGQ.[LiteralSanitized] IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
但引擎正在执行以下操作:
literal列如果我的列是Persisted,为什么引擎继续尝试返回Literal列,因为它甚至不需要?
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |