AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 305950
Accepted
Mandelbrotter
Mandelbrotter
Asked: 2022-01-12 08:43:46 +0800 CST2022-01-12 08:43:46 +0800 CST 2022-01-12 08:43:46 +0800 CST

如果所有查询只需要完美匹配(没有部分文本搜索),应该使用什么索引

  • 772

我想提高在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]));

我正在研究需要创建目录的全文搜索。如果我正确理解我的研究,这将极大地有益于需要在文本中搜索子字符串的人,而这里的情况并非如此。相反,我希望像字符串二进制索引这样的东西可以更快地确定我的搜索字符串是否包含在列中。

sql-server index-tuning
  • 2 2 个回答
  • 155 Views

2 个回答

  • Voted
  1. MBuschi
    2022-01-13T00:57:48+08:002022-01-13T00:57:48+08:00

    我建议评估 [name] 字段的 MAX LEN ,看看它的实际用法。

    您最终可以使用 [name] 字段的前 8000 个字符添加一个新字段并为该字段编制索引。

    但是您必须以可搜索的方式重塑存储数据的方式。

    • 0
  2. Best Answer
    Stephen Morris - Mo64
    2022-01-13T11:16:35+08:002022-01-13T11:16:35+08:00

    对于宽字符列,最好的办法是计算校验和并添加索引。

    然后计算您正在搜索的内容的校验和并将其添加到您的查询中,如下所示:

    -- 添加一个持久化计算列,我们将计算类型为 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 毫秒。

    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve