我想提高在var dbObj = dbSet.Where(x => x.Name == name).FirstOrDefault();
下面粘贴的表上完成的查询的性能。我正在考虑在[Name]
. 如果我不需要查询子字符串的能力,我应该使用什么类型的索引?
CREATE TABLE [dbo].[TitleTypes] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[Name] VARCHAR (MAX) NOT NULL,
SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL,
SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL,
PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime),
CONSTRAINT [PK_TitleTypes] PRIMARY KEY CLUSTERED ([Id] ASC)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.[TitleTypesHistory]));
我正在研究需要创建目录的全文搜索。如果我正确理解我的研究,这将极大地有益于需要在文本中搜索子字符串的人,而这里的情况并非如此。相反,我希望像字符串二进制索引这样的东西可以更快地确定我的搜索字符串是否包含在列中。
我建议评估 [name] 字段的 MAX LEN ,看看它的实际用法。
您最终可以使用 [name] 字段的前 8000 个字符添加一个新字段并为该字段编制索引。
但是您必须以可搜索的方式重塑存储数据的方式。
对于宽字符列,最好的办法是计算校验和并添加索引。
然后计算您正在搜索的内容的校验和并将其添加到您的查询中,如下所示:
-- 添加一个持久化计算列,我们将计算类型为 nvarchar(max) 的 body 列的校验和 alter table dbo.posts add chksum_body as checksum(body) persisted
-- 为新列向表中添加非聚集索引在 dbo.posts (chksum_body) 上创建非聚集索引 ncix_posts_chksum_body
-- 显示查询 io 和 cpu 使用集统计信息 io, time on
-- 我们需要 2 个变量,一个用于我们要搜索的字符串,一个用于它的校验和 declare @str nvarchar(max) declare @chksumstr int
-- 使用搜索字符串初始化变量 select @str = N'谁能帮我在 SQL Server 中索引宽列' -- 计算搜索字符串的校验和并存储在变量中 select @chksumstr = checksum(@str )
-- 比较搜索旧方式(无索引) select top 100 * from [dbo].[Posts] where body = N'谁能帮我在 SQL Server 中索引宽列'
-- 要使用校验和进行搜索,请注意我们重新检查正文的值以消除由于校验和冲突而导致的任何错误匹配 -- 但由于我们有一个索引搜索,我们只是对少数匹配行进行残差过滤,选择前 100 个 *来自 [dbo].[Posts] 其中 body = @str 和 chksum_body = @chksumstr SQL Server 执行时间:CPU 时间 = 0 毫秒,已用时间 = 0 毫秒。
Id AcceptedAnswerId AnswerCount Body 72 0 2 谁能帮我在 SQL Server 中索引宽列(受影响的 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 毫秒。
Id AcceptedAnswerId AnswerCount Body 72 0 2 谁能帮我在 SQL Server 中索引宽列(受影响的 1 行)
表“帖子”。扫描计数 1,逻辑读取 7,物理读取 4,页面服务器读取 0,预读读取 0,页面服务器预读读取 0,lob 逻辑读取 0,lob 物理读取 0,lob 页面服务器读取 0,lob 读取-预读为 0,lob 页面服务器预读为 0。
SQL Server 执行时间:CPU 时间 = 0 毫秒,经过时间 = 0 毫秒。