一个子查询,速度慢的问题,条件越多,速度越慢,如何解决?

swxandwf 2010-11-15 01:06:56
select cc_crk_gsid,cc_wlbm_cpbh,cc_wlbm_pch,cc_wlbm_pm,cc_wlbm_ggxh,cc_wlbm_dj,cc_wlbm_pp,cc_wlbm_kz,isnull((select cast(sum(cc_jtmx_sjsl) as varchar)+'$'+cast(sum(cc_jtmx_sjsl*cc_wlbm_jz) as varchar) from v_cc_tj_khhw tj_qcrk where tj_qcrk.cc_crk_gsid=tj.cc_crk_gsid and tj_qcrk.cc_wlbm_cpbh=tj.cc_wlbm_cpbh and tj_qcrk.cc_wlbm_pch=tj.cc_wlbm_pch and tj_qcrk.cc_wlbm_pm=tj.cc_wlbm_pm and tj_qcrk.cc_wlbm_ggxh=tj.cc_wlbm_ggxh and tj_qcrk.cc_wlbm_dj=tj.cc_wlbm_dj and tj_qcrk.cc_wlbm_pp=tj.cc_wlbm_pp and tj_qcrk.cc_wlbm_kz=tj.cc_wlbm_kz and tj_qcrk.cc_crk_gsid=18 and datediff(d,'2010-11-01',tj_qcrk.rksj)<0),'0$0') as qcrks from v_cc_tj_khhw tj where cc_crk_gsid=18 and 1=1 group by cc_crk_gsid,cc_wlbm_cpbh,cc_wlbm_pch,cc_wlbm_pm,cc_wlbm_ggxh,cc_wlbm_dj,cc_wlbm_pp,cc_wlbm_kz


这条SQL语句,本身没有什么问题,但是执行速度很慢,里面就一个子查询,只是说,我把子查询条件tj_qcrk.cc_wlbm_cpbh=tj.cc_wlbm_cpbh and tj_qcrk.cc_wlbm_pch=tj.cc_wlbm_pch and tj_qcrk.cc_wlbm_pm=tj.cc_wlbm_pm and tj_qcrk.cc_wlbm_ggxh=tj.cc_wlbm_ggxh and tj_qcrk.cc_wlbm_dj=tj.cc_wlbm_dj and tj_qcrk.cc_wlbm_pp=tj.cc_wlbm_pp and tj_qcrk.cc_wlbm_kz=tj.cc_wlbm_kz,去掉,速度就很快,只是这些条件又不能取消,要不然数据出来的不准,我在这些字段中,都加了索引,可是速度还是慢,请达人指点
...全文
223 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-11-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 swxandwf 的回复:]

可否详细介绍一下,谢谢,有人说,是因为我的子查询条件太复杂的原故?
[/Quote]
可能你的View所涉及到的实体表数据量也比较大吧,先看看执行计划(ctrl + L)
可以把执行计划截个图发上来看看。
--小F-- 2010-11-15
  • 打赏
  • 举报
回复
加索引的话还要看能不能完全用到啊 如果不能完全用到 反而会减慢速度...

具体的可以CTRL+l查看执行计划
swxandwf 2010-11-15
  • 打赏
  • 举报
回复
谢谢,zsh0809,这样的话,速度怎么越来越慢了,其实我里面就一张视图表,v_cc_tj_khhw,但这张视图本身速度并不慢
swxandwf 2010-11-15
  • 打赏
  • 举报
回复
可否详细介绍一下,谢谢,有人说,是因为我的子查询条件太复杂的原故?
「已注销」 2010-11-15
  • 打赏
  • 举报
回复
帮你简单改了一下,你看看性能如何,选中这句sql,ctrl + L,看看执行计划,
需要加上index的地方请加上,排除table scan部分。

SELECT CC_CRK_GSID,CC_WLBM_CPBH,CC_WLBM_PCH,CC_WLBM_PM,CC_WLBM_GGXH
,CC_WLBM_DJ,CC_WLBM_PP,CC_WLBM_KZ
,ISNULL(CAST(SUM(TJ_QCRK.CC_JTMX_SJSL) AS VARCHAR)+'$'
+CAST(SUM(TJ_QCRK.CC_JTMX_SJSL*CC_WLBM_JZ) AS VARCHAR),'0$0') AS QCRKS
FROM V_CC_TJ_KHHW TJ
LEFT JOIN
V_CC_TJ_KHHW TJ_QCRK
ON (TJ_QCRK.CC_CRK_GSID=TJ.CC_CRK_GSID
AND TJ_QCRK.CC_WLBM_CPBH=TJ.CC_WLBM_CPBH
AND TJ_QCRK.CC_WLBM_PCH=TJ.CC_WLBM_PCH
AND TJ_QCRK.CC_WLBM_PM=TJ.CC_WLBM_PM
AND TJ_QCRK.CC_WLBM_GGXH=TJ.CC_WLBM_GGXH
AND TJ_QCRK.CC_WLBM_DJ=TJ.CC_WLBM_DJ
AND TJ_QCRK.CC_WLBM_PP=TJ.CC_WLBM_PP
AND TJ_QCRK.CC_WLBM_KZ=TJ.CC_WLBM_KZ
AND TJ_QCRK.CC_CRK_GSID=18
AND DATEDIFF(D,'2010-11-01',TJ_QCRK.RKSJ)<0
)
WHERE CC_CRK_GSID=18 AND 1=1
GROUP BY CC_CRK_GSID,CC_WLBM_CPBH,CC_WLBM_PCH,CC_WLBM_PM,
CC_WLBM_GGXH,CC_WLBM_DJ,CC_WLBM_PP,CC_WLBM_KZ
生活真美好 2010-11-15
  • 打赏
  • 举报
回复
子查询条件做成一个临时表,先保存查询内容,主查询关联这个临时表就快了,以前试过。
swxandwf 2010-11-15
  • 打赏
  • 举报
回复
select cc_crk_gsid,cc_wlbm_cpbh,cc_wlbm_pch,cc_wlbm_pm,cc_wlbm_ggxh,cc_wlbm_dj,cc_wlbm_pp,cc_wlbm_kz,isnull((select cast(sum(cc_jtmx_sjsl) as varchar)+'$'+cast(sum(cc_jtmx_sjsl*cc_wlbm_jz) as varchar) from v_cc_tj_khhw tj_qcrk where tj_qcrk.cc_crk_gsid=tj.cc_crk_gsid and tj_qcrk.cc_wlbm_cpbh=tj.cc_wlbm_cpbh and tj_qcrk.cc_wlbm_pch=tj.cc_wlbm_pch and tj_qcrk.cc_wlbm_pm=tj.cc_wlbm_pm and tj_qcrk.cc_wlbm_ggxh=tj.cc_wlbm_ggxh and tj_qcrk.cc_wlbm_dj=tj.cc_wlbm_dj and tj_qcrk.cc_wlbm_pp=tj.cc_wlbm_pp and tj_qcrk.cc_wlbm_kz=tj.cc_wlbm_kz and tj_qcrk.cc_crk_gsid=18 and datediff(d,'2010-11-01',tj_qcrk.rksj)<0),'0$0') as qcrks from v_cc_tj_khhw tj where cc_crk_gsid=18 and 1=1 group by cc_crk_gsid,cc_wlbm_cpbh,cc_wlbm_pch,cc_wlbm_pm,cc_wlbm_ggxh,cc_wlbm_dj,cc_wlbm_pp,cc_wlbm_kz


红色的条件取消,速度就很快
kevin87923 2010-11-15
  • 打赏
  • 举报
回复

22,209

社区成员

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

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