惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - jadesun

【转载】Zachman框架 参加了IBM的架构师培训,总结了一些内容 数据仓库 - 事实表和维度表建立的方法论 Hadoop的学习历程 Hadoop手册_v0.3 MySQL_Cluster 的尝试及各种测试 Hadoop的学习历程 Hadoop手册_v0.2 尝试数据分片处理 和同事扯了一个理论模型出来,后面再验证是否合理。 依赖倒置原则 迪米特法则 中国航油项目的一次数据库优化,关于Audit Logout的问题。 公文流转SQL优化日志七 公文流转SQL优化日志六 和同事们终于将Entity FrameWork整合进新的框架中了,发布第一个版本。 继续上篇实现的架构,有了新的进展。介绍一下格瑞趋势的产品 工作日志,正在实现中的架构,针对SQL SERVER。参考了DZ的设计 公文流转SQL优化日志四 公文流转SQL优化日志三 公文流转SQL优化日志二
公文流转SQL优化日志五
jadesun · 2011-07-26 · via 博客园 - jadesun

周四在新大厦办公,正好遇上老董反映公文查询失败的问题。和小红监视了该查询语句在高峰期间,查询耗时需要40多秒,所以有必要整一整它了。

公文查询功能由于数据的原因,我不能在本地调试,全得由珊姐执行测试的思路。珊姐在执行老董的相关查询之后,返回的系统信息如下:

(28 行受影响)

'tbCommonPart'。扫描计数1逻辑读取1690869 ,物理读取0 次,预读1 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

'Worktable'。扫描计数14逻辑读取10570670 ,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

'Worktable'。扫描计数0,逻辑读取0 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

'tmp40072411'。扫描计数14,逻辑读取6773 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

'Worktable'。扫描计数0,逻辑读取0 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

SQL Server 执行时间:

   CPU 时间= 17406 毫秒,占用时间= 8751 毫秒。

娘的,tbCommonPart的逻辑读169万次,WorkTable表有1000多万次的逻辑读,执行时间累计26秒左右。

从存储过程中分析得到老董执行的存储过程核心语句有下面的四条。

1SELECT distinct b.cnvcDeptid, cast(b.cnvcDeptid as varchar(300)) AS cnvcOrganID INTO tmp74790211 FROM tbUserRole a, tbRole b  WHERE a.cnvcDisable = '1' AND b.cniRoleId = a.cniRoleId AND b.cnvcDisable = '1'  AND cncJiYaoFlag !='0' AND a.cnvcUserId = '1000032237';

2SELECT a.cnvcDeptid,b.cnvcOrganID INTO  tmp67731953 FROM tmp74790211 a, tbCompany b WHERE a.cnvcDeptid = b.cniNodeID;

3SELECT distinct a.cniId as cniCommonPartId INTO tmp93053275 FROM DBHNAOA3_2011.dbo.tbCommonPart  a ,tmp74790211 b WHERE a.cnvcSendOrganId = b.cnvcDeptid;

4SELECT distinct top 100 a.cniId, a.cniId as cniCommonPartId, a.cnvcFileType, a.cnvcFileName, a.cnvcTitle, a.cnvcSecName, a.cnvcSecretaryKind,a.cndSendTime, a.cnvcSendEname, a.cnvcSendCname, a.cndEndTime, a.cnvcSendOrganId, a.cnvcEndFlag  FROM DBHNAOA3_2011.dbo.tbCommonPart a, tmp93053275 b  WHERE a.cnvcEndFlag != '0' AND a.cniId = b.cniCommonPartId AND a.cnvcTitle like '%马国华%'  AND a.cndEndTime >= '2011-01-01' AND a.cndEndTime < '2011-07-15'  AND a.cnvcSecretaryKind not in ('0202','0203','0204')  ORDER BY a.cndEndTime DESC

在执行第四条语句时出现了Worktable表,说明访问了大容量的临时表,造成了SQL优化器生成一个worktable来缓存中间查询结果,因为临时表是默认没有索引的。在执行a.cniId = b.cniCommonPartId就会产生 tmp93053275 表的全表扫描。

tmp93053275表的数据量从系统信息可以看出(560469 行受影响) ,该表有56万行数据参于全表扫描。根据笛卡儿乘积,WorkTable表就产生了1000多万次逻辑读。

这个性能优化的方法也很简单,就是给tmp93053275表的cniCommonPartId字段创建索引项。修改sp_QueryDoc这个存储过程,加入下面的语句。

set @tempSql = 'CREATE INDEX IX_Temp_vcTempTable3_CommonPartId ON '+@vcTmpTable3+'(cniCommonPartId)';

exec(@tempSql);

重新让珊姐执行老董的查询语句,反馈的信息如下:

(28 行受影响)

'tmp95890048'。扫描计数28,逻辑读取114 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

'tbCommonPart'。扫描计数1,逻辑读取1690742 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。

SQL Server 执行时间:

   CPU 时间= 2828 毫秒,占用时间= 2833 毫秒。

总结:存储过程经过优化之后,WorkTable表和1000多万次的逻辑读没有了,查询时间也从25秒降到了4-5秒左右。但是tbCommonPart表还有169万次的逻辑读,因为珊姐和我的环境里面观察到的执行计划不同。这个要留到后面有时间时再去优化了。