news 2026/6/10 13:19:52

网友的一个SQL问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网友的一个SQL问题

起因

网友问在一个大表里 [工艺名称] like '%抛%' 是否能优化

俺的回答是 这个工艺名称 是否有数据字典,如果有数据字典就可以优化

分析

写在分析前

  1. 其实erp his 等这些mis 系统一般在开发时都是先开发数据字典部分。
  2. like '%抛%' ,索引很难有效果,如果是 like '抛%' 索引就有效果了。

俺生成了629万数据进行测试,用2种写法实现like '%抛%'

写法1

select count(*) from [工时] where 工艺名称 like '%抛%'

耗时3秒左右

写法2

declare @t table(name varchar(50) index idx_1) insert into @t (name) select * from 字典 where 名称 like '%抛%' select count(*) from [工时]a ,@t b where a.工艺名称=b.name

耗时不到1秒

前提 字段 工艺名称 有索引

为什么呢?

其实就是一句话:使用了索引

分步骤拆解

第一步:从字典表查询符合条件的名称

sql

insert into @t (name) select * from 字典 where 名称 like '%抛%'
  • 字典表特性:行数极少(通常几千到几万条,最多不超过 10 万)
  • 即使这里也用LIKE '%抛%'全表扫描,总页数也只有几十到几百页
  • 耗时:几毫秒,几乎可以忽略不计
  • 结果集大小:通常只有几条到几十条(比如所有包含 "抛" 的工艺名称可能只有 5 个:抛光、抛丸、喷砂抛丸、手工抛、机械抛)
第二步:用小结果集驱动大表做精确匹配

sql

select count(*) from [工时]a ,@t b where a.工艺名称=b.name
  • 连接方式:SQL Server 自动选择嵌套循环连接(小表驱动大表的最优算法)
  • 索引利用:现在是a.工艺名称 = b.name精确匹配,完全符合 B 树索引的查找条件
  • IO 开销:对 @t 中的每一个 name,执行 1 次索引查找,每次查找仅需 3-4 次 IO(B 树深度)
  • 假设 @t 返回 5 条记录:总 IO 开销 = 5 × 4 =20 次 IO

总开销对比

表格

指标写法 1(直接 LIKE)写法 2(字典表关联)性能提升倍数
逻辑读次数~46,000 次~20 次2300 倍
CPU 开销遍历 629 万条记录遍历 5 条记录125 万倍
实际耗时~3 秒<1 秒~5 倍

核心结论

你的优化方案的本质是:

大表的模糊查询转化为小表的模糊查询 + 大表的精确匹配查询

利用了 MIS 系统 "业务字段几乎都有数据字典" 的天然优势,用极小的代价(扫描小字典表)换取了巨大的性能提升(将大表的全索引扫描转化为几次索引查找)。这是一种架构级的优化思路,比单纯的 SQL 语法优化要高明得多。

另:

很多人误以为 "只要字段有索引,任何查询都快",这是完全错误的。SQL Server 的 B 树索引只对前缀匹配有效

表格

查询写法索引利用方式性能等级
工艺名称 LIKE '抛%'索引查找 (Index Seek)⭐⭐⭐⭐⭐
工艺名称 LIKE '%抛'索引扫描 (Index Scan)⭐⭐
工艺名称 LIKE '%抛%'索引扫描 (Index Scan)⭐⭐

还有优化的地方吗?

亲 有的

WITH (NOLOCK)

例如 from 字典 WITH(NOLOCK)

例如 from [工时] a WITH(NOLOCK)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 13:17:15

浏览器市场分析-大屏静态布局制作

浏览器市场分析-大屏静态布局制作1 实验目的本实验基于《浏览器市场与用户画像分析-数据加工》产出的各项统计表&#xff0c;使用助睿Max数据大屏制作浏览器市场行为分析大屏。通过本实验&#xff0c;学生应掌握&#xff1a;2 实验环境实验平台&#xff1a;助睿在线实验平台 ht…

作者头像 李华
网站建设 2026/6/10 13:16:27

监控iOS设备性能的工具Perfdog:特点、使用步骤与代码示例

监控iOS设备性能的工具&#xff1a;Perfdog 在移动应用开发过程中&#xff0c;性能监控是一个非常重要的环节。Perfdog是一款专门针对iOS设备进行性能监控的工具&#xff0c;它可以帮助开发者及时发现并解决应用性能问题&#xff0c;提高应用的用户体验。 Perfdog的特点 Perfdo…

作者头像 李华
网站建设 2026/6/10 13:11:00

sendgrid-python:用 Python 调用 SendGrid 邮件 API

文章目录sendgrid-python&#xff1a;用 Python 调用 SendGrid 邮件 API1、这项目是干嘛的2、安装和配置3、发一封邮件有多简单4、不止能发邮件5、适合哪些人用sendgrid-python&#xff1a;用 Python 调用 SendGrid 邮件 API sendgrid-python 在 GitHub 上已经拿到 1,628 Star…

作者头像 李华
网站建设 2026/6/10 13:07:59

新能源电动汽车价格大揭秘:影响因素、趋势与选购策略

在全球倡导绿色出行和应对气候变化的大背景下&#xff0c;新能源电动汽车成为了汽车市场的热门领域。其价格问题一直是消费者、汽车制造商以及相关行业关注的焦点。 从消费者的角度来看&#xff0c;新能源电动汽车的价格是他们决定是否购买的关键因素之一。对于普通消费者而言&…

作者头像 李华