问题描述
有一数据表(产品标签表,每个产品一个唯一的SN,每月100万左右),查询界面上有2个联动下拉框,【规格】____,【批次】______
用户选择一个规格后(目前200来个规格),列出该规格下达过的生产计划的批次。

原有方式
规格列表
select 规格 from 标签表 group by 规格

根据规格获取批次
select 批次 From 标签表 Where 规格=‘某一规格’ group by 批次

由于要进行全表扫描,当数据到50万以上时速度就明显慢下来了,而到200万时上面任意一个查询都要1分钟左右。

解决方案

方案1:建立索引
组合“规格,批次”建立一个索引(批次单独建立了聚集索引)。
问题,因为一条记录对应一个索引条目,所以这个方案需要很多额外的空间,另外原来表上已经有3个索引了,过多的索引会导致更新与插入性能下降,并且死锁风险会提高,作为流水线上使用的模块,性是有要求的。

方案2:建立一张规格批次对应表,记录规格跟批次的对关系
由于规格200来个并且比较稳定,批次一月也就100来个,而且这100个批次只分配给二三十个批次所以这两者的组合一个月也就1500-2000条左右。

考虑使用规格批次对应表后,进一步就是确定怎么维护对应表的数据,
方式一,就是每次生产任务分解生成标签的同时更新规格批次对应表(即标签表记录的增删改时做对应的操作)。考虑那个任务分解代码已经够纠结了,不打算大量修改程序代码。

方式二,数据库建立个作业,定期增量更新
生产任务会做调整(删除或更改),不过变动几率不高,而且多数改动都在上班时间内任务下达后1-2小时内修改(隔天的基本已经在执行状态或已经完成了)
所以作业安排在晚上12点进行,而作业执行点之后标签表新增记录的规格与批次的对应关系则没包括在对应表中,因此下拉框的查询结果来自两部,作业执行点前的规格批次对应关系来自对应表,而作业执行点后规格批次对应关系则直接查询标签表,由于每次作业执行点都记录当前统计时最大的记录ID号,因此查询标签表时会使用如下的查询语句:
Select  批次 From 标签表 Where 规格='某一规格' And Id>xxxx ,由于在Id上建了索引,而每天心记录在3,4万条,所以这个查询在执行时间上基本稳定。

完成的代码类似下面:

View Code

ALTER Proc [dbo].[Get批次By规格]
@规格 nvarchar(20)
AsCreate Table #t_CT_BNO_MAP_tmp
( 批次 nvarchar(20)) Declare @MaxLblId bigintDeclare @SQL nvarchar(2000)Set @MaxLblId=0select @MaxLblId= Max(LblId) From 规格批次对应表Set @SQL=
'select 批次From(Select 批次 from 标签表  where Id>='+cast(@MaxLbLId as nvarchar(50))+' And  规格='''+@规格+'''group by 批次  UnionSelect 批次  From 规格批次对应表 where 规格='''+ @规格+''') as tgroup by 批次'Insert Into #t_CT_BNO_MAP_tmp
Exec(@SQL)Select * from #t_CT_BNO_MAP_tmpDrop Table #t_CT_BNO_MAP_tmp

注意点:
上面采用了动态SQL来执行包含" Id>='+cast(@MaxLbLId as nvarchar(50))+" 的语句来获取标签表中的规格批次对应关系,如果不采用动态SQL,直接使用
Id>@MaxLblId的条件,那么由于是存储过程MSSQL查询优化器不清楚MaxLblId可能是多少,而忽略Id上已建的索引,而进行全表扫描。
两者的执行过程如下图:
(静态SQL语句)

(动态SQL语句)

作业任务代码:

View Code

declare @MaxLblId bigint
Declare @SQL nvarchar(2000)
Set @MaxLblId=0
select @MaxLblId= Max(LblId) From dbo.规格批次表Set @SQL='
Insert Into 规格批次表(规格,batno,LblId)
select 规格,Batno,LblId
From(Select 规格,batno Batno,Max(Id) LblId from 标签表    where Id>='+cast(@MaxLbLId as nvarchar(50))+'group by 规格, batnoExceptSelect 规格,Batno,LblIdFrom KB_Lable_CT_BNO_MAP ) as t
'
Exec(@SQL)

转载于:https://www.cnblogs.com/wdfrog/archive/2013/03/03/2941302.html

一个大数据量表访问优化--联动下拉框查询优化相关推荐

  1. 大数据量表的优化查询

    1:索引,我们最先想到的就是创建索引,创建索引可以成倍的提升查询的效率,节省时间.但是如果数据量太过于巨大的时候,这个时候单纯的创建索引是无济于事的,我们知道假如特别是在大数据量中统计查询,就拿100 ...

  2. 提高大数据量并发访问时效率

    最近在做windows服务方面的开发,主要用它来解决A服务和其他服务发送数据失败后,重新发送的问题. 为了提高大数据量并发访问时效率问题,要在多台服务器上安装服务并采用多线程,就像是超市的收银,利用多 ...

  3. mysql scrapy 重复数据_MySQL大数据量表中删除重复记录

    MySQL大数据量表中删除重复记录 最近工作中需要抓取大量新闻,抓取的数据中由于一些原因存在一些重复数据,而整个数据表的记录数接近10万条,大小接近1个G,又在我自己的渣渣本本上,查询速度十分不理想, ...

  4. 针对大数据量的渲染优化库:react-virtual的基本使用

    针对大数据量的渲染优化库:react-virtual的基本使用 针对大数据量的渲染优化库:react-virtual(List)的基本使用 react-virtual库的安装及引用 安装 使用 针对大 ...

  5. 如何构建一个大数据量的搜索引擎

    构建一个大数据量的搜索引擎,数据很重要,数据来源在哪里呢?一方面可以从站内结构化数据库导入,如MySQL,Oracle等数据库,构建一个站内搜索引擎,提高查询速度.另一方面构建一个分布式爬虫,每天定时 ...

  6. 航测大数据量处理_【应用案例】徕卡HxMap软件并行处理环境 在大数据量、高效率处理要求下的应用...

    原标题:[应用案例]徕卡HxMap软件并行处理环境 在大数据量.高效率处理要求下的应用 1. HxMap软件简介 HxMap是徕卡航空传感器通用数据处理平台,可提供徕卡测量多款航摄仪的数据后处理以及三 ...

  7. 2018最新版省市区三级联动下拉框+所有源代码以及数据库

    2018年国家统计局最新数据,JSP+Servlet+Dao实现省市区三级联动下拉框的效果 DropdownDAO.java -–Dao层 package com;import java.sql.Co ...

  8. javascript实现下拉条联动_js实现多级联动下拉框

    花了半天时间实现一个多级联动下拉框,目的是对某一植物进行"门纲目科属"的归类.使用的技术是javascript+xml,之所以不用数据库,一来这方面的数据虽然量大但都是固定不变的, ...

  9. 联动下拉框显示省市县

    首先,这次用到的知识点有三层的逻辑还有连接数据库知识以及传参知识点,废话不多说,首先展示页面: 首先第一本机的数据库,连接字符创写在app.cofing里,这个不用多说了: <configura ...

最新文章

  1. 入门4:PHP 语法基础1
  2. 第六章---机器学习与数据建模
  3. 音视频技术开发周刊 | 192
  4. linux 内核设备管理模型sysfs(入门篇)
  5. iOS开发--AVFoundation自定义相机
  6. 这样的AI技术实战方式,大boss都看不下去了!
  7. 内存溢出错误:java堆空间
  8. ubuntu下载字体
  9. web3.0、元宇宙、AIOT探讨-产品思维修炼(15)
  10. 怎么建立局域网_win8系统如何建立局域网 win8建立局域网操作方法【步骤详解】...
  11. git push 时出现错误error: failed to push some refs to ‘https://gitee.com/**.git‘
  12. BaseAdataer基本设配器
  13. SPI驱动SX1278模块1-网关.SPI头文件,c文件,sx1278头文件和c文件,主函数
  14. 派生类成员的访问属性
  15. html 带边框的梯形,css clip-path画带边框梯形多边形
  16. CSDN如何上传视频?
  17. c语言输入123输出112233,C语言程序的设计 第3章 程序语言基础1.pdf
  18. Linux下创建用户并设置权限
  19. python 计算器 loop_python计算器实现 Yeah
  20. 深入理解Java虚拟机(三)——对象已死吗

热门文章

  1. 终面后拿offer几率_面经 | 如愿以偿进入自己喜欢的游戏行业:我是怎样争取到理想OFFER的?...
  2. python字典值求和_Python两个字典键同值相加的方法总结
  3. cuda笔记-GPU多线程的奇偶排序
  4. Android逆向笔记-破解自己编写的Android应用程序(开发及破解)
  5. Qt工作笔记-WebEngineView调用web站点中的JS脚本(含Vue Cli脚本)
  6. 实现电子词典_它是一部电子词典,一部翻译机,一部口语机还是一部出游的随身WiFi...
  7. java 获取子类实际的类型名_Java 泛型类 以及 泛型类获取子类的具体参数类型 以及 获取子类型具体参数的实例...
  8. python 加密解密_Python中的加密和解密
  9. string插入字符_String类
  10. python快速入门步骤_Python快速入门