查询性能优化。。。。

ylovep 2013-01-16 03:46:47
from JSHX_EM_StkRecordLine srl
left join JSHX_EM_StkRecord sr on srl.cHeadGUID=sr.cGUID
left join CM_Material cm on srl.cMatGUID=cm.cGUID
left join CM_Unit cu on srl.cUnitGUID = cu.cGUID
left join CM_Unit cMu ON srl.cMUnitGUID = cMu.cGUID
left join JSHX_EM_Area ea on srl.cMatArea=ea.cGUID
left join ST_MatPosition mp on srl.cGUID = mp.cStkLineID
left join cm_customer cc on sr.cCustGUID =cc.cGUID
where
iAuditStatus='1' and
srl.iOutQTY<srl.iQTY and
sr.cBusType='04001' and
cStkOutLineStatus='0' and

sr.cCustGUID ='533411669541064724' and
sr.cStoreGUID = '533411669541001619'


红色是固定条件
蓝色是动态
如何优化 查询 目前五六万属于 查询需要十几秒 求高手支招
若建立索引如何建立。
...全文
351 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylovep 2013-01-17
  • 打赏
  • 举报
回复

还是十五秒左右
昵称被占用了 2013-01-17
  • 打赏
  • 举报
回复
srl.cHeadGUID有无索引 iAuditStatus='1' and sr.cBusType='04001' and sr.cCustGUID ='533411669541064724' and sr.cStoreGUID = '533411669541001619' 这四个字段都重复率很高吗,怎么全部是扫描,考虑建立一个四字段的组合索引
昵称被占用了 2013-01-17
  • 打赏
  • 举报
回复
引用 27 楼 ylovep 的回复:
引用 26 楼 Haiwer 的回复: 单 srl.cStkOutLineStatus='0' 这个条件的记录有多少 srl.cStkOutLineStatus有无索引 单 srl.cStkOutLineStatus='0'占大部分 cStkOutLineStatus
这个索引没起到作用,应该删除 最好增加一个字段(sql server可以用计算字段,也可以考虑触发器维护这个字段)存放iQTY - iOutQTY的值,并建立索引,查询条件改为 这个字段 > 0
ylovep 2013-01-17
  • 打赏
  • 举报
回复
引用 26 楼 Haiwer 的回复:

srl.cStkOutLineStatus='0'
这个条件的记录有多少
srl.cStkOutLineStatus有无索引


srl.cStkOutLineStatus='0'占大部分
cStkOutLineStatus
昵称被占用了 2013-01-17
  • 打赏
  • 举报
回复
单 srl.cStkOutLineStatus='0' 这个条件的记录有多少 srl.cStkOutLineStatus有无索引
ylovep 2013-01-17
  • 打赏
  • 举报
回复
srl.cStkOutLineStatus='0'
sr.iAuditStatus='1'
昵称被占用了 2013-01-17
  • 打赏
  • 举报
回复
20楼图窄了点,看不清哪个表
發糞塗牆 2013-01-17
  • 打赏
  • 举报
回复
用DTA(数据库引擎顾问),把你的查询丢里面去分析好了。 http://blog.csdn.net/dba_huangzj/article/details/7643763
昵称被占用了 2013-01-17
  • 打赏
  • 举报
回复
iAuditStatus='1' and cStkOutLineStatus='0' and 这两个字段哪个表的 在JSHX_EM_StkRecordLine srl、JSHX_EM_StkRecord 这两个表根据使用的字段建立组合索引,重复率低的字段排在前面 另外,这两个表需要关注数据量,数据量大的索引才有效果
ylovep 2013-01-17
  • 打赏
  • 举报
回复
给个合理的方案啊
ylovep 2013-01-17
  • 打赏
  • 举报
回复
發糞塗牆 2013-01-17
  • 打赏
  • 举报
回复
单列建索引往往性能都不怎么好,而全表索引甚至更差
ylovep 2013-01-17
  • 打赏
  • 举报
回复

除了数量没有 查询条件用到的字段都有非聚集索引
昵称被占用了 2013-01-17
  • 打赏
  • 举报
回复
最重要的应该是 JSHX_EM_StkRecordLine srl、JSHX_EM_StkRecord 这两个表在where出现的字段没有索引(看图好像是聚集索引扫描),加上索引速度会有数量级的提高
昵称被占用了 2013-01-17
  • 打赏
  • 举报
回复
CM_Material(cGUID ) ST_MatPosition(cStkLineID) 需要索引 你的图不够全,更重要的没有看到 总体来说,你的所有关联字段没有索引,所以出现很多聚集索引扫描或者表扫描 left join JSHX_EM_StkRecord sr on srl.cHeadGUID=sr.cGUID 应该改成 inner join JSHX_EM_StkRecord sr on srl.cHeadGUID=sr.cGUID
發糞塗牆 2013-01-17
  • 打赏
  • 举报
回复
应该还有其他百分比大的地方,表、索引、聚集索引扫描通常因为缺少索引导致。把鼠标移到那些有扫描且百分比较大的图表上,看看它是用了哪些列,尝试做个索引看看。
Mr_Nice 2013-01-17
  • 打赏
  • 举报
回复
减少聚集索引扫描、表扫描。 建索引哦。
ylovep 2013-01-17
  • 打赏
  • 举报
回复
Paddy 2013-01-16
  • 打赏
  • 举报
回复
楼主 简化的手段多种多样。在系统规划阶段就必须考虑如何避免复杂查询。一个不好的设计会使你不得不在无数表之间进行多次交叉连接才能得到数据,这大大降低了性能。常见的简化规则如下: 1)不要有超过5个以上的表连接(JOIN) 2)考虑使用临时表或表变量存放中间结果。 3)少用子查询 4)视图嵌套不要过深 用临时表存放中间结果集试试
haitao 2013-01-16
  • 打赏
  • 举报
回复
除了 srl.iOutQTY和srl.iQTY 外 其他0楼所提的所有字段都有索引了吗?
加载更多回复(10)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧