没有合适的资源?快使用搜索试试~ 我知道了~
实战:上亿数据如何秒查.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 5 浏览量
2022-07-03
18:33:58
上传
评论
收藏 1.26MB PDF 举报
温馨提示
![preview](https://dl-preview.csdnimg.cn/85883002/0001-57570dcf3abbec67517d8fd1cdd4db0f_thumbnail.jpeg)
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
试读
33页
实战:上亿数据如何秒查.pdf实战:上亿数据如何秒查.pdf实战:上亿数据如何秒查.pdf实战:上亿数据如何秒查.pdf实战:上亿数据如何秒查.pdf实战:上亿数据如何秒查.pdf实战:上亿数据如何秒查.pdf实战:上亿数据如何秒查.pdf
资源推荐
资源详情
资源评论
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![xlsx](https://img-home.csdnimg.cn/images/20210720083732.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![xsl](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/release/download_crawler_static/85883002/bg1.jpg)
实战:上亿数据如何秒查
最近在忙着优化集团公司的一个报表。优化完成后,报
表查询速度有从半小时以上(甚至查不出)到秒查的质变。从
修改 SQL 查询语句逻辑到决定创建存储过程实现,花了我 3
天多的时间,在此总结一下,希望对朋友们有帮助。数据背
景首先项目是西门子中国在我司实施部署的 MES 项目,由
于项目是在产线上运作(3 years+),数据累积很大。在项目
的数据库中,大概上亿条数据的表有 5 个以上,千万级数据
的表 10 个以上,百万级数据的表,很多...(历史问题,当初
实施无人监管,无人监控数据库这块的性能问题。ps:我刚入
职不久...)不多说,直接贴西门子中国的开发人员在我司开发
的 SSRS 报表中的 SQL 语句: View Code 这个查询语句,
实际上通过我的检测和调查,在 B/S 系统前端已无法查出结
果,半小时,一小时 ... 。因为我直接在 SQL 查询分析器查,
半小时都没有结果。(原因是里面对一张上亿级数据表和 3
张千万级数据表做全表扫描查询)不由感慨,西门子中国的素
质(或者说责任感)就这样?下面说说我的分析和走的弯路
(思维误区),希望对你也有警醒。探索和误区首先相关表的
索引,没有建全的,把索引给建上。索引这步完成后,发现
情况还是一样,查询速度几乎没有改善。后来想起相关千万
级数据以上的表,都还没有建立表分区。于是考虑建立表分
![](https://csdnimg.cn/release/download_crawler_static/85883002/bg2.jpg)
区以及数据复制的方案。这里有必要说明下:我司报表用的
是一个专门的数据库服务器,数据从产线订阅而来。就是常
说的“读写分离”。如果直接在原表上建立表分区,你会发现
执行表分区的事物会直接死锁。原因是:表分区操作本身会
锁表,产线还在推数据过来,这样很容易“阻塞”,“死锁”。我
想好的方案是:建立一个新表(空表),在新表上建好表分区,
然后复制数据过来。正打算这么干。等等!我好像进入了一
个严重的误区!分析: 原 SQL 语句和业务需求,是对产线
的数据做产品以及序列号的追溯,关键是查询条件里没有有
规律的"条件"(如日期、编号), 贸然做了表分区,
在这里几乎没有意义!反而会降低查询性能!好险!还是一
步一步来,先做 SQL 语句分析。一. 对原 SQL 语句的分析
1. 查询语句的 where 条件,有大量@var in ... or (@var ='')
的片段 2. where 条件有 like '%'+@var+'%' 3. where 条件有
case ... end 函数 4. 多次连接同一表查询,另外使用本身已
嵌套的视图表,是不是必须,是否可替代?5. SQL 语句有*
号,视图中也有*号出现二. 优化设计首先是用存储过程改写,
好处是设计灵活。核心思想是:用一个或多个查询条件(查询
条件要求至少输入一个)得到临时表,每个查询条件如果查到
集合,就更新这张临时表,最后汇总的时候,
只需判断这个临时表是否有值。以此类推,可以建立多个临
时表,将查询条件汇总。这样做目前来看至少两点好处:1.
![](https://csdnimg.cn/release/download_crawler_static/85883002/bg3.jpg)
省去了对变量进行 =@var or (@var='')的判断;
2.抛弃 sql 拼接,提高代码可读性。再有就是在书写存储过
程,这个过程中要注意:1. 尽量想办法使用临时表扫描替代
全表扫描;2. 抛弃 in 和 not in 语句,使用 exists 和 not exists
替代;3. 和客户确认,模糊查询是否有必要,如没有必要,
去掉 like 语句;4. 注意建立适当的,符合场景的索引;5. 踩
死 "*" 号;6. 避免在 where 条件中对字段进行函数操作;
7. 对实时性要求不高的报表,允许脏读(with(nolock))。三.
存储过程如果想参考优化设计片段的详细内容,请参阅 SQL
代码: 1 /**
2 * 某某跟踪报表
3 **/
4 --exec spName1 '','','','','','','公司代号'
5 CREATE Procedure spName1
6 @MESOrderID nvarchar(320), --工单号,最多 30 个
7 @LotName nvarchar(700), --产品序列号,最多
50 个
8 @DateCode nvarchar(500), --供应商批次号,最
多 30 个
9 @BatchID nvarchar(700), --组装件序列号/物料
批号,最多 50 个
10 @comdef nvarchar(700), --组装件物料编码,
![](https://csdnimg.cn/release/download_crawler_static/85883002/bg4.jpg)
最多 30 个
11 @SNCust nvarchar(1600), --外部序列号,最多
50 个
12 @OnPlant nvarchar(20) --平台
13 AS
14 BEGIN
15 SET NOCOUNT ON;
16 /**
17 * 1)定义全局的临时表,先根据六个查询条件的任
意一个,得出临时表结果
18 **/
19 CREATE TABLE #FinalLotName
20 (
21 LotName NVARCHAR(50), --序列号
22 SourceLotName NVARCHAR(50), --来源序
列号
23 SNCust NVARCHAR(128) --外部序
列号
24 )
25 --1.1
26 IF @LotName<>''
27 BEGIN
![](https://csdnimg.cn/release/download_crawler_static/85883002/bg5.jpg)
28 SELECT Val INTO #WorkLot FROM
fn_String_To_Table(@LotName,',',1)
29 SELECT LotPK,LotName INTO #WorkLotPK
FROM MMLots WITH(NOLOCK) WHERE
EXISTS(SELECT 1 FROM #WorkLot b WHERE
b.Val=MMLots.LotID)
30
31 --求 SourceLotPK 只能在这里求
32 SELECT a.LotPK,a.SourceLotPK into
#WorkSourcePK FROM MMLotOperations a
WITH(NOLOCK) WHERE EXISTS(SELECT 1 FROM
#WorkLotPK b WHERE b.LotPK=a.LotPK) AND
a.SourceLotPK IS NOT NULL
33
34 SELECT
a.LotPK,a.SourceLotPK,b.LotName INTO
#WorkSourcePK2 FROM #WorkSourcePK a JOIN
#WorkLotPK b ON a.LotPK=b.LotPK
35
36 INSERT INTO #FinalLotName SELECT
a.LotName,b.LotName AS SourceLotName,NULL FROM
#WorkSourcePK2 a JOIN (SELECT LotPK,LotName
剩余32页未读,继续阅读
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/06779827608847128b637bead301d722_weixin_72426331.jpg!1)
คิดถึง643
- 粉丝: 3931
- 资源: 1万+
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)